[
  {
    "path": ".gitignore",
    "content": "# Xcode\n.DS_Store\n*/build/*\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n*.xccheckout\nprofile\n*.moved-aside\nDerivedData\n.idea/\n*.hmap\n\n#CocoaPods\nPods\nPodfile.lock"
  },
  {
    "path": "AKImageCropperView/AKImageCropperOverlayView.swift",
    "content": "//\n//  AKImageCropperOverlayView.swift\n//\n//  Created by Artem Krachulov.\n//  Copyright (c) 2016 Artem Krachulov. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n// and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge, publish, distribute,\n// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or\n// substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\n// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE\n// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n// DEALINGS IN THE SOFTWARE.\n//\n\nimport UIKit\n\nprotocol AKImageCropperOverlayViewDelegate : class {\n    func cropperOverlayViewDidChangeCropRect(_ view: AKImageCropperOverlayView, _ cropRect: CGRect)\n}\n\nopen class AKImageCropperOverlayView: UIView {\n    \n    // MARK: -\n    // MARK: ** Properties **\n\n    /** Configuration structure for the Overlay View appearance and behavior. */\n\n    open var configuraiton = AKImageCropperCropViewConfiguration()\n    \n    /** Crop rectangle */\n    \n    internal var cropRect: CGRect = .zero\n    \n    /** Saved crop rectangle state */\n    \n    fileprivate var touchesBegan: (touch: CGPoint, cropRect: CGRect)!\n\n    /** Current active crop area part */\n    \n    fileprivate var activeCropAreaPart: AKCropAreaPart = .none {\n        didSet { layoutSubviews() }\n    }\n    \n    fileprivate struct AKCropAreaPart: OptionSet {\n        \n        public let rawValue: Int\n        \n        public init(rawValue: Int) {\n            self.rawValue = rawValue\n        }\n        \n        static let none                 = AKCropAreaPart(rawValue: 1 << 0)\n        static let topEdge              = AKCropAreaPart(rawValue: 1 << 1)\n        static let leftEdge             = AKCropAreaPart(rawValue: 1 << 2)\n        static let bottomEdge           = AKCropAreaPart(rawValue: 1 << 3)\n        static let rightEdge            = AKCropAreaPart(rawValue: 1 << 4)\n\n        static let all: AKCropAreaPart = [.topEdge, .rightEdge, .bottomEdge, .leftEdge]\n        \n        static let topLeftCorner: AKCropAreaPart        = [.topEdge, .leftEdge]\n        static let topRightCorner: AKCropAreaPart       = [.topEdge, .rightEdge]\n        static let bottomRightCorner: AKCropAreaPart    = [.bottomEdge, .rightEdge]\n        static let bottomLeftCorner: AKCropAreaPart     = [.bottomEdge, .leftEdge]\n    }\n    \n    //  MARK: Managing the Delegate\n\n    weak var delegate: AKImageCropperOverlayViewDelegate?\n    \n    //  MARK: Touch & Parts views\n    \n    fileprivate var topcropView: UIView!\n    fileprivate var rightcropView: UIView!\n    fileprivate var bottomcropView: UIView!\n    fileprivate var leftcropView: UIView!\n    fileprivate var topEdgeTouchView: UIView!\n    fileprivate var topEdgeView: UIView!\n    fileprivate var rightEdgeTouchView: UIView!\n    fileprivate var rightEdgeView: UIView!\n    fileprivate var bottomEdgeTouchView: UIView!\n    fileprivate var bottomEdgeView: UIView!\n    fileprivate var leftEdgeTouchView: UIView!\n    fileprivate var leftEdgeView: UIView!\n    fileprivate var topLeftCornerTouchView: UIView!\n    fileprivate var topLeftCornerView: UIView!\n    fileprivate var topRightCornerTouchView: UIView!\n    fileprivate var topRightCornerView: UIView!\n    fileprivate var bottomRightCornerTouchView: UIView!\n    fileprivate var bottomRightCornerView: UIView!\n    fileprivate var bottomLeftCornerTouchView: UIView!\n    fileprivate var bottomLeftCornerView: UIView!\n    fileprivate var gridView: UIView!\n    fileprivate var gridViewVerticalLines: [UIView]!\n    fileprivate var gridViewHorizontalLines: [UIView]!\n    \n    // MARK: -\n    // MARK: ** Initialization OBJECTS(VIEWS) & theirs parameters **\n    \n    /** Parent (main) class to translate some properties and objects. */\n    \n    weak var cropperView: AKImageCropperView!\n\n    fileprivate (set) lazy var overlayView: UIView! = {\n        let view = UIView()\n        view.backgroundColor = UIColor.black.withAlphaComponent(0.5)\n        view.clipsToBounds = true\n        return view\n    }()\n    \n    fileprivate lazy var containerImageView: UIView! = {\n        let view = UIView()\n        view.backgroundColor = UIColor.clear\n        view.clipsToBounds = true\n        view.isUserInteractionEnabled = false\n        return view\n    }()\n    \n    fileprivate lazy var imageView: UIImageView! = {\n        let view = UIImageView()\n        view.backgroundColor = UIColor.clear\n        return view\n    }()\n    \n    open var image: UIImage! {\n        didSet {\n            imageView.image = image\n        }\n    }\n    \n    //  MARK: - Initialization\n\n    /**\n     Returns an overlay view initialized with the specified configuraiton.\n     \n     - Parameter configuraiton: Configuration structure for the Overlay View appearance and behavior.\n     */\n    \n    init() {\n        super.init(frame: .zero)\n        \n        backgroundColor = .clear\n        alpha = 0\n        \n        initialize()\n    }\n    \n    public init(configuraiton: AKImageCropperCropViewConfiguration? = nil) {\n        super.init(frame: CGRect.zero)\n        \n        if configuraiton != nil {\n            self.configuraiton = configuraiton!\n        }\n        \n        backgroundColor = UIColor.clear\n        alpha = 0\n        \n        initialize()\n    }\n    \n    required public init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    // MARK: - Draving Crop rect frame\n    \n    fileprivate func initialize() {\n        \n        /*\n         Create views layout.\n         Step by step\n         \n         1. OverlayView\n         */\n        \n        addSubview(overlayView)\n        \n        let blurEffect = UIBlurEffect(style: configuraiton.overlay.blurStyle)\n        let blurEffectView = UIVisualEffectView(effect: blurEffect)\n        blurEffectView.alpha = self.configuraiton.overlay.blurAlpha\n        \n        blurEffectView.frame = overlayView.bounds\n        blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]\n        overlayView.addSubview(blurEffectView)\n        \n        /* 2. Container view ‹‹ Image view */\n        \n        containerImageView.addSubview(imageView)\n        addSubview(containerImageView)\n        \n        /* 3. Crop rectangle */\n        \n        //  Edges\n        \n        topEdgeTouchView = UIView()\n        addSubview(topEdgeTouchView)\n        \n        topEdgeView = UIView()\n        topEdgeTouchView.addSubview(topEdgeView)\n        \n        rightEdgeTouchView = UIView()\n        addSubview(rightEdgeTouchView)\n        \n        rightEdgeView = UIView()\n        rightEdgeTouchView.addSubview(rightEdgeView)\n        \n        bottomEdgeTouchView = UIView()\n        addSubview(bottomEdgeTouchView)\n        \n        bottomEdgeView = UIView()\n        bottomEdgeTouchView.addSubview(bottomEdgeView)\n        \n        leftEdgeTouchView = UIView()\n        addSubview(leftEdgeTouchView)\n        \n        leftEdgeView = UIView()\n        leftEdgeTouchView.addSubview(leftEdgeView)\n        \n        if configuraiton.edge.isHidden {\n            topEdgeView.isHidden = true\n            rightEdgeView.isHidden = true\n            bottomEdgeView.isHidden = true\n            leftEdgeView.isHidden = true\n        }\n        \n        //  Corners\n        \n        topLeftCornerTouchView  = UIView()\n        addSubview(topLeftCornerTouchView)\n        \n        topLeftCornerView = UIView()\n        topLeftCornerView.layer.addSublayer(CAShapeLayer())\n        topLeftCornerTouchView.addSubview(topLeftCornerView)\n        \n        topRightCornerTouchView  = UIView()\n        addSubview(topRightCornerTouchView)\n        \n        topRightCornerView = UIView()\n        topRightCornerView.layer.addSublayer(CAShapeLayer())\n        topRightCornerTouchView.addSubview(topRightCornerView)\n        \n        bottomRightCornerTouchView  = UIView()\n        addSubview(bottomRightCornerTouchView)\n        \n        bottomRightCornerView = UIView()\n        bottomRightCornerView.layer.addSublayer(CAShapeLayer())\n        bottomRightCornerTouchView.addSubview(bottomRightCornerView)\n        \n        bottomLeftCornerTouchView  = UIView()\n        addSubview(bottomLeftCornerTouchView)\n        \n        bottomLeftCornerView = UIView()\n        bottomLeftCornerView.layer.addSublayer(CAShapeLayer())\n        bottomLeftCornerTouchView.addSubview(bottomLeftCornerView)\n        \n        if configuraiton.corner.isHidden {\n            topLeftCornerView.isHidden = true\n            topRightCornerView.isHidden = true\n            bottomRightCornerView.isHidden = true\n            bottomLeftCornerView.isHidden = true\n        }\n        \n        //  Grid\n        \n        gridView = UIView()\n        \n        gridViewVerticalLines = []\n        gridViewHorizontalLines = []\n        \n        for _ in 0..<configuraiton.grid.linesCount.vertical {\n            \n            let view = UIView()\n            \n            view.frame.size.width = configuraiton.grid.linesWidth\n            view.backgroundColor = configuraiton.grid.linesColor\n            \n            gridViewVerticalLines.append(view)\n            gridView.addSubview(view)\n        }\n        \n        for _ in 0..<configuraiton.grid.linesCount.horizontal {\n            \n            let view = UIView()\n            \n            view.frame.size.height = configuraiton.grid.linesWidth\n            view.backgroundColor = configuraiton.grid.linesColor\n            \n            gridViewHorizontalLines.append(view)\n            gridView.addSubview(view)\n        }\n        \n        addSubview(gridView)\n        \n        gridView.isHidden = configuraiton.grid.isHidden\n        \n        if configuraiton.grid.alwaysShowGrid {\n            gridView.alpha = 1\n        } else {\n            gridView.alpha = 0\n        }\n\n    }\n    \n    //  MARK: - Life cycle\n    \n    override open func layoutSubviews() {\n        super.layoutSubviews()\n        \n        overlayView.frame = frame\n        containerImageView.frame = cropRect\n        matchForegroundToBackgroundScrollViewOffset()\n        matchForegroundToBackgroundScrollViewSize()\n        \n        topEdgeTouchView.frame = cropAreaTopEdgeFrame\n        layoutTopEdgeView(topEdgeView,\n                          inTouchView: topEdgeTouchView,\n                          forState: activeCropAreaPart == .topEdge\n                            ? .highlighted\n                            : .normal)\n        \n        rightEdgeTouchView.frame = cropAreaRightEdgeFrame\n        layoutRightEdgeView(rightEdgeView,\n                            inTouchView: rightEdgeTouchView,\n                            forState: activeCropAreaPart == .rightEdge\n                                ? .highlighted\n                                : .normal)\n        \n        bottomEdgeTouchView.frame = cropAreaBottomEdgeFrame\n        layoutBottomEdgeView(bottomEdgeView,\n                             inTouchView: bottomEdgeTouchView,\n                             forState: activeCropAreaPart == .bottomEdge\n                                ? .highlighted\n                                : .normal)\n        \n        leftEdgeTouchView.frame = cropAreaLeftEdgeFrame\n        layoutLeftEdgeView(leftEdgeView,\n                           inTouchView: leftEdgeTouchView,\n                           forState: activeCropAreaPart == .leftEdge\n                            ? .highlighted\n                            : .normal)\n        \n        topLeftCornerTouchView.frame = cropAreaTopLeftCornerFrame\n        layoutTopLeftCornerView(topLeftCornerView,\n                                inTouchView: topLeftCornerTouchView,\n                                forState: activeCropAreaPart == .topLeftCorner\n                                    ? .highlighted\n                                    : .normal)\n        \n        topRightCornerTouchView.frame = cropAreaTopRightCornerFrame\n        layoutTopRightCornerView(topRightCornerView,\n                                 inTouchView: topRightCornerTouchView,\n                                 forState: activeCropAreaPart == .topRightCorner\n                                    ? .highlighted\n                                    : .normal)\n        \n        bottomRightCornerTouchView.frame = cropAreaBottomRightCornerFrame\n        layoutBottomRightCornerView(bottomRightCornerView,\n                                    inTouchView: bottomRightCornerTouchView,\n                                    forState: activeCropAreaPart == .bottomRightCorner\n                                        ? .highlighted\n                                        : .normal)\n        \n        bottomLeftCornerTouchView.frame = cropAreaBottomLeftCornerFrame\n        layoutBottomLeftCornerView(bottomLeftCornerView,\n                                   inTouchView: bottomLeftCornerTouchView,\n                                   forState: activeCropAreaPart == .bottomLeftCorner\n                                    ? .highlighted\n                                    : .normal)\n        \n        gridView.frame = cropRect\n        layoutGridView(gridView, gridViewHorizontalLines: gridViewHorizontalLines, gridViewVerticalLines: gridViewVerticalLines)\n    }\n    \n    //  MARK: Crop rectangle parts rects\n\n    fileprivate var cropAreaTopLeftCornerFrame: CGRect {\n        return CGRect(\n            origin: CGPoint(\n                x: cropRect.origin.x - configuraiton.cornerTouchSize.width / 2,\n                y: cropRect.origin.y - configuraiton.cornerTouchSize.height / 2),\n            size: configuraiton.cornerTouchSize)\n    }\n    \n    fileprivate var cropAreaTopRightCornerFrame: CGRect {\n        return CGRect(\n            origin: CGPoint(\n                x: cropRect.maxX - configuraiton.cornerTouchSize.width / 2,\n                y: cropRect.minY - configuraiton.cornerTouchSize.height / 2),\n            size: configuraiton.cornerTouchSize)\n    }\n    \n    fileprivate var cropAreaBottomLeftCornerFrame: CGRect {\n        return CGRect(\n            origin: CGPoint(\n                x: cropRect.origin.x - configuraiton.cornerTouchSize.width / 2,\n                y: cropRect.maxY - configuraiton.cornerTouchSize.height / 2),\n            size: configuraiton.cornerTouchSize)\n    }\n    \n    fileprivate var cropAreaBottomRightCornerFrame: CGRect {\n        return CGRect(\n            origin: CGPoint(\n                x: cropRect.maxX - configuraiton.cornerTouchSize.width / 2,\n                y: cropRect.maxY - configuraiton.cornerTouchSize.height / 2),\n            size: configuraiton.cornerTouchSize)\n    }\n    \n    fileprivate var cropAreaTopEdgeFrame: CGRect{\n        return CGRect(\n            x       : cropAreaTopLeftCornerFrame.maxX,\n            y       : cropRect.origin.y - configuraiton.edgeTouchThickness.horizontal / 2,\n            width   : cropRect.size.width - (cropAreaTopLeftCornerFrame.size.width / 2 + cropAreaTopRightCornerFrame.size.width / 2),\n            height  : configuraiton.edgeTouchThickness.horizontal)\n    }\n    \n    fileprivate var cropAreaBottomEdgeFrame: CGRect {\n        return CGRect(\n            x       : cropAreaBottomLeftCornerFrame.maxX,\n            y       : cropRect.maxY - configuraiton.edgeTouchThickness.horizontal / 2,\n            width   : cropRect.size.width - (cropAreaBottomLeftCornerFrame.size.width / 2 + cropAreaBottomRightCornerFrame.size.width / 2),\n            height  : configuraiton.edgeTouchThickness.horizontal)\n    }\n    \n    fileprivate var cropAreaRightEdgeFrame: CGRect {\n        return CGRect(\n            x       : cropRect.maxX - configuraiton.edgeTouchThickness.vertical / 2,\n            y       : cropAreaTopLeftCornerFrame.maxY,\n            width   : configuraiton.edgeTouchThickness.vertical,\n            height  : cropRect.size.height - (cropAreaTopRightCornerFrame.size.height / 2 + cropAreaBottomRightCornerFrame.size.height / 2))\n    }\n    \n    fileprivate var cropAreaLeftEdgeFrame: CGRect {\n        return CGRect(\n            x       : cropRect.origin.x - configuraiton.edgeTouchThickness.vertical / 2,\n            y       : cropAreaTopLeftCornerFrame.maxY,\n            width   : configuraiton.edgeTouchThickness.vertical,\n            height  : cropRect.size.height - (cropAreaTopLeftCornerFrame.size.height / 2 + cropAreaBottomLeftCornerFrame.size.height / 2))\n    }\n    \n    fileprivate func getCropAreaPartContainsPoint(_ point: CGPoint) -> AKCropAreaPart {\n        if cropAreaTopEdgeFrame.contains(point) {\n            return .topEdge\n        } else if cropAreaBottomEdgeFrame.contains(point) {\n            return .bottomEdge\n        } else if cropAreaRightEdgeFrame.contains(point) {\n            return .rightEdge\n        } else if cropAreaLeftEdgeFrame.contains(point) {\n            return .leftEdge\n        } else if cropAreaTopLeftCornerFrame.contains(point) {\n            return .topLeftCorner\n        } else if cropAreaTopRightCornerFrame.contains(point) {\n            return .topRightCorner\n        } else if cropAreaBottomLeftCornerFrame.contains(point) {\n            return .bottomLeftCorner\n        } else if cropAreaBottomRightCornerFrame.contains(point) {\n            return .bottomRightCorner\n        } else {\n            return .none\n        }\n    }\n    \n    // MARK: Other methods\n    \n    final func showOverlayBlur(_ show: Bool, completion: ((Bool) -> Void)? = nil) {\n\n        UIView.animate(withDuration: configuraiton.animation.duration, delay: 0, options: [], animations: {\n           \n                self.overlayView.subviews.first?.alpha = show ? self.configuraiton.overlay.blurAlpha : 0.0\n\n        }, completion: { isComplete in\n            completion?(isComplete)\n        })\n    }\n    \n    final func showGrid(_ show: Bool, completion: ((Bool) -> Void)? = nil) {\n        \n        if configuraiton.grid.alwaysShowGrid {\n             completion?(true)\n            return\n        }\n        \n        let animations: () -> Void = { _ in\n            self.gridView.alpha = show ? 1 : 0\n        }\n        \n        if configuraiton.animation.duration == 0 {\n            \n            animations()\n            \n        } else {\n        \n            UIView.animate(withDuration: configuraiton.animation.duration, delay: 0, options: [], animations: animations, completion: { isComplete in\n                completion?(isComplete)\n            })\n        }\n    }\n    \n    /**\n     Visual representation for top edge view in current user interaction state.\n     \n     - Parameter view: Top edge view.\n     \n     - Parameter touchView: Touch area view where added top edge view.\n     \n     - Parameter state: User interaction state.\n     */\n    \n    open func layoutTopEdgeView(_ view: UIView, inTouchView touchView: UIView, forState state: AKImageCropperCropViewTouchState) {\n        \n        var color: UIColor\n        var width: CGFloat\n        \n        if state == .normal {\n            color = configuraiton.edge.normalLineColor\n            width = configuraiton.edge.normalLineWidth\n        } else {\n            color = configuraiton.edge.highlightedLineColor\n            width = configuraiton.edge.highlightedLineWidth\n        }\n        \n        view.backgroundColor = color\n        view.frame = CGRect(\n            x       : touchView.bounds.origin.x - configuraiton.cornerTouchSize.width / 2 - configuraiton.edge.normalLineWidth,\n            y       : touchView.bounds.midY - width,\n            width   : touchView.bounds.size.width + configuraiton.cornerTouchSize.width + configuraiton.edge.normalLineWidth * 2,\n            height  : width)\n    }\n    \n    /**\n     Visual representation for right edge view in current user interaction state.\n     \n     - Parameter view: Right edge view.\n     \n     - Parameter touchView: Touch area view where added right edge view.\n     \n     - Parameter state: User interaction state.\n     */\n    \n    open func layoutRightEdgeView(_ view: UIView, inTouchView touchView: UIView, forState state: AKImageCropperCropViewTouchState) {\n        \n        var color: UIColor\n        var width: CGFloat\n        \n        if state == .normal {\n            color = configuraiton.edge.normalLineColor\n            width = configuraiton.edge.normalLineWidth\n        } else {\n            color = configuraiton.edge.highlightedLineColor\n            width = configuraiton.edge.highlightedLineWidth\n        }\n        \n        view.backgroundColor = color\n        view.frame = CGRect(\n            x       : touchView.bounds.midX,\n            y       : touchView.bounds.origin.y - configuraiton.cornerTouchSize.height / 2 - configuraiton.edge.normalLineWidth,\n            width   : width,\n            height  : touchView.bounds.size.height + configuraiton.cornerTouchSize.height + configuraiton.edge.normalLineWidth * 2)\n    }\n    \n    /**\n     Visual representation for bottom edge view in current user interaction state.\n     \n     - Parameter view: Bottom edge view.\n     \n     - Parameter touchView: Touch area view where added bottom edge view.\n     \n     - Parameter state: User interaction state.\n     */\n    \n    open func layoutBottomEdgeView(_ view: UIView, inTouchView touchView: UIView, forState state: AKImageCropperCropViewTouchState) {\n        \n        var color: UIColor\n        var width: CGFloat\n        \n        if state == .normal {\n            color = configuraiton.edge.normalLineColor\n            width = configuraiton.edge.normalLineWidth\n        } else {\n            color = configuraiton.edge.highlightedLineColor\n            width = configuraiton.edge.highlightedLineWidth\n        }\n      \n        view.backgroundColor = color\n        view.frame = CGRect(\n            x       : touchView.bounds.origin.x - configuraiton.cornerTouchSize.width / 2 - configuraiton.edge.normalLineWidth,\n            y       : touchView.bounds.midY,\n            width   : touchView.bounds.size.width + configuraiton.cornerTouchSize.width + configuraiton.edge.normalLineWidth * 2,\n            height  : width)\n    }\n    \n    /**\n     Visual representation for left edge view in current user interaction state.\n     \n     - Parameter view: Left edge view.\n     \n     - Parameter touchView: Touch area view where added left edge view.\n     \n     - Parameter state: User interaction state.\n     */\n    \n    open func layoutLeftEdgeView(_ view: UIView, inTouchView touchView: UIView, forState state: AKImageCropperCropViewTouchState) {\n        \n        var color: UIColor\n        var width: CGFloat\n        \n        if state == .normal {\n            color = configuraiton.edge.normalLineColor\n            width = configuraiton.edge.normalLineWidth\n        } else {\n            color = configuraiton.edge.highlightedLineColor\n            width = configuraiton.edge.highlightedLineWidth\n        }\n        \n        view.backgroundColor = color\n        view.frame = CGRect(\n            x       : touchView.bounds.midX - width,\n            y       : touchView.bounds.origin.y - configuraiton.cornerTouchSize.height / 2 - configuraiton.edge.normalLineWidth,\n            width   : width,\n            height  : touchView.bounds.size.height + configuraiton.cornerTouchSize.height + configuraiton.edge.normalLineWidth * 2)\n    }\n    \n    /**\n     Visual representation for top left corner view in current user interaction state. Drawing going with added shape layer.\n     \n     - Parameter view: Top left corner view.\n     \n     - Parameter touchView: Touch area view where added top left edge view.\n     \n     - Parameter state: User interaction state.\n     */\n    \n    open func layoutTopLeftCornerView(_ view: UIView, inTouchView touchView: UIView, forState state: AKImageCropperCropViewTouchState) {\n        \n        var lineWidth: CGFloat\n        let layer: CAShapeLayer = view.layer.sublayers!.first as! CAShapeLayer\n        \n        if state == .normal {\n            \n            layer.fillColor = configuraiton.corner.normalLineColor.cgColor\n            view.frame.size = configuraiton.corner.normaSize\n            lineWidth = configuraiton.corner.normalLineWidth\n            \n        } else {\n            \n            layer.fillColor = configuraiton.edge.highlightedLineColor.cgColor\n            view.frame.size = configuraiton.corner.highlightedSize\n            lineWidth = configuraiton.corner.highlightedLineWidth\n        }\n        \n        view.center = CGPoint(x: touchView.bounds.midX, y: touchView.bounds.midY)\n        \n        let rect = CGRect(origin: CGPoint(x: view.bounds.midX - lineWidth, y: view.bounds.midY - lineWidth), size: view.frame.size)\n        \n        let substractRect = CGRect(\n            x       : rect.origin.x + lineWidth,\n            y       : rect.origin.y + lineWidth,\n            width   : rect.size.width - lineWidth,\n            height  : rect.size.height - lineWidth)\n        \n        let path = UIBezierPath(rect: rect)\n        path.append(UIBezierPath(rect: substractRect).reversing())\n        \n        layer.path = path.cgPath\n    }\n    \n    /**\n     Visual representation for top right corner view in current user interaction state. Drawing going with added shape layer.\n     \n     - Parameter view: Top right corner view.\n     \n     - Parameter touchView: Touch area view where added top right edge view.\n     \n     - Parameter state: User interaction state.\n     */\n    \n    open func layoutTopRightCornerView(_ view: UIView, inTouchView touchView: UIView, forState state: AKImageCropperCropViewTouchState) {\n        \n        var lineWidth: CGFloat\n        let layer: CAShapeLayer = view.layer.sublayers!.first as! CAShapeLayer\n        \n        if state == .normal {\n            \n            layer.fillColor = configuraiton.corner.normalLineColor.cgColor\n            view.frame.size = configuraiton.corner.normaSize\n            lineWidth = configuraiton.corner.normalLineWidth\n            \n        } else {\n            \n            layer.fillColor = configuraiton.edge.highlightedLineColor.cgColor\n            view.frame.size = configuraiton.corner.highlightedSize\n            lineWidth = configuraiton.corner.highlightedLineWidth\n        }\n        \n        view.center = CGPoint(x: touchView.bounds.midX, y: touchView.bounds.midY)\n        \n        let rect = CGRect(origin: CGPoint(x: -view.bounds.midX + lineWidth, y: view.bounds.midY - lineWidth), size: view.frame.size)\n        \n        let substractRect = CGRect(\n            x       : rect.origin.x,\n            y       : rect.origin.y + lineWidth,\n            width   : rect.size.width - lineWidth,\n            height  : rect.size.height - lineWidth)\n        \n        let path = UIBezierPath(rect: rect)\n        \n        path.append(UIBezierPath(rect: substractRect).reversing())\n        layer.path = path.cgPath\n    }\n    \n    /**\n     Visual representation for bottom right corner view in current user interaction state. Drawing going with added shape layer.\n     \n     - Parameter view: Bottom right corner view.\n     \n     - Parameter touchView: Touch area view where added bottom right edge view.\n     \n     - Parameter state: User interaction state.\n     */\n    \n    open func layoutBottomRightCornerView(_ view: UIView, inTouchView touchView: UIView, forState state: AKImageCropperCropViewTouchState) {\n        \n        var lineWidth: CGFloat\n        let layer: CAShapeLayer = view.layer.sublayers!.first as! CAShapeLayer\n        \n        if state == .normal {\n            \n            layer.fillColor = configuraiton.corner.normalLineColor.cgColor\n            view.frame.size = configuraiton.corner.normaSize\n            lineWidth = configuraiton.corner.normalLineWidth\n            \n        } else {\n            \n            layer.fillColor = configuraiton.edge.highlightedLineColor.cgColor\n            view.frame.size = configuraiton.corner.highlightedSize\n            lineWidth = configuraiton.corner.highlightedLineWidth\n        }\n        \n        view.center = CGPoint(x: touchView.bounds.midX, y: touchView.bounds.midY)\n        \n        let rect = CGRect(origin: CGPoint(x: -view.bounds.midX + lineWidth, y: -view.bounds.midY + lineWidth), size: view.frame.size)\n        \n        let substractRect = CGRect(\n            x       : rect.origin.x,\n            y       : rect.origin.y,\n            width   : rect.size.width - lineWidth,\n            height  : rect.size.height - lineWidth)\n        \n        let path = UIBezierPath(rect: rect)\n        \n        path.append(UIBezierPath(rect: substractRect).reversing())\n        layer.path = path.cgPath\n    }\n    \n    /**\n     Visual representation for bottom left corner view in current user interaction state. Drawing going with added shape layer.\n     \n     - Parameter view: Bottom left corner view.\n     \n     - Parameter touchView: Touch area view where added bottom left edge view.\n     \n     - Parameter state: User interaction state.\n     */\n    \n    open func layoutBottomLeftCornerView(_ view: UIView, inTouchView touchView: UIView, forState state: AKImageCropperCropViewTouchState) {\n        \n        var lineWidth: CGFloat\n        let layer: CAShapeLayer = view.layer.sublayers!.first as! CAShapeLayer\n        \n        if state == .normal {\n            \n            layer.fillColor = configuraiton.corner.normalLineColor.cgColor\n            view.frame.size = configuraiton.corner.normaSize\n            lineWidth = configuraiton.corner.normalLineWidth\n            \n        } else {\n            \n            layer.fillColor = configuraiton.edge.highlightedLineColor.cgColor\n            view.frame.size = configuraiton.corner.highlightedSize\n            lineWidth = configuraiton.corner.highlightedLineWidth\n        }\n        \n        view.center = CGPoint(x: touchView.bounds.midX, y: touchView.bounds.midY)\n        \n        let rect = CGRect(origin: CGPoint(x: view.bounds.midX - lineWidth, y: -view.bounds.midY + lineWidth), size: view.frame.size)\n        \n        let substractRect = CGRect(\n            x       : rect.origin.x + lineWidth,\n            y       : rect.origin.y,\n            width   : rect.size.width - lineWidth,\n            height  : rect.size.height - lineWidth)\n        \n        let path = UIBezierPath(rect: rect)\n        \n        path.append(UIBezierPath(rect: substractRect).reversing())\n        layer.path = path.cgPath\n    }\n    \n    /**\n     \n     Visual representation for grid view.\n     \n     - Parameter view: Grid view.\n     \n     - Parameter gridViewHorizontalLines: Horizontal line view`s array.\n     \n     - Parameter gridViewVerticalLines: Vertical line view`s array.\n     */\n    \n    open func layoutGridView(_ view: UIView, gridViewHorizontalLines: [UIView], gridViewVerticalLines: [UIView]) {\n        \n        for (i, line) in gridViewHorizontalLines.enumerated() {\n            \n            line.frame.origin = CGPoint(x: 0, y: view.frame.height * CGFloat(i + 1) / CGFloat(gridViewHorizontalLines.count + 1))\n            line.frame.size.width = view.frame.width\n        }\n        \n        for (i, line) in gridViewVerticalLines.enumerated() {\n            \n            line.frame.origin = CGPoint(x: view.frame.width * CGFloat(i + 1) / CGFloat(gridViewVerticalLines.count + 1), y: 0)\n            line.frame.size.height = view.frame.height\n        }\n    }\n    \n    // MARK: - Touches\n    \n    override open func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {\n        \n        guard let touch = touches.first else {  return }\n        \n        /* Save */\n        \n        touchesBegan = (touch.location(in: self), cropRect)\n\n        /* Active part */\n        \n        activeCropAreaPart = getCropAreaPartContainsPoint(touchesBegan.touch)\n    }\n    \n    override open func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {\n  \n        guard let touch = touches.first else { return }\n\n        /* GET TRANSLATION POINT */\n   \n        let point = touch.location(in: self)\n        let previousPoint = touch.previousLocation(in: self)\n        \n        let translationPoint = CGPoint(x: point.x - previousPoint.x, y: point.y - previousPoint.y)\n        \n        /* MOVE FRAME */\n        \n        let cropRectMaxFrame = cropperView.reversedFrameWithInsets\n        \n        if activeCropAreaPart.contains(.topEdge) {\n            \n            cropRect.origin.y += translationPoint.y\n            cropRect.size.height -= translationPoint.y\n            \n            let pointInEdge = touchesBegan.touch.y - touchesBegan.cropRect.minY\n            let minStickPoint = pointInEdge + cropRectMaxFrame.minY\n            let maxStickPoint = pointInEdge + touchesBegan.cropRect.maxY - configuraiton.minCropRectSize.height\n            \n            if point.y > maxStickPoint || cropRect.height < configuraiton.minCropRectSize.height {\n                cropRect.origin.y = touchesBegan.cropRect.maxY - configuraiton.minCropRectSize.height\n                cropRect.size.height = configuraiton.minCropRectSize.height\n            }\n            \n            if point.y < minStickPoint {\n                cropRect.origin.y = cropRectMaxFrame.minY\n                cropRect.size.height = touchesBegan.cropRect.maxY - cropRectMaxFrame.minY\n            }\n        }\n        \n        if activeCropAreaPart.contains(.rightEdge) {\n            \n            cropRect.size.width += translationPoint.x\n            \n            let pointInEdge = touchesBegan.touch.x - touchesBegan.cropRect.maxX\n            let minStickPoint = pointInEdge + touchesBegan.cropRect.minX + configuraiton.minCropRectSize.width\n            let maxStickPoint = pointInEdge + cropRectMaxFrame.maxX\n            \n            if  point.x > maxStickPoint {\n                cropRect.size.width =  cropRectMaxFrame.maxX - cropRect.origin.x\n            }\n            \n            if point.x < minStickPoint || cropRect.width < configuraiton.minCropRectSize.width {\n                cropRect.size.width = configuraiton.minCropRectSize.width\n            }\n        }\n        \n        if activeCropAreaPart.contains(.bottomEdge) {\n\n            cropRect.size.height += translationPoint.y\n            \n            let pointInEdge = touchesBegan.touch.y - touchesBegan.cropRect.maxY\n            let minStickPoint = pointInEdge + touchesBegan.cropRect.minY + configuraiton.minCropRectSize.height\n            let maxStickPoint = pointInEdge + cropRectMaxFrame.maxY\n            \n            if  point.y > maxStickPoint {\n                cropRect.size.height = cropRectMaxFrame.maxY - cropRect.origin.y\n            }\n            \n            if point.y < minStickPoint || cropRect.height < configuraiton.minCropRectSize.height {\n                cropRect.size.height = configuraiton.minCropRectSize.height\n            }\n        }\n        \n        if activeCropAreaPart.contains(.leftEdge) {\n            \n            cropRect.origin.x += translationPoint.x\n            cropRect.size.width -= translationPoint.x\n            \n            let pointInEdge = touchesBegan.touch.x - touchesBegan.cropRect.minX\n            let minStickPoint = pointInEdge + cropRectMaxFrame.minX\n            let maxStickPoint = pointInEdge + touchesBegan.cropRect.maxX - configuraiton.minCropRectSize.width\n            \n            if  point.x > maxStickPoint || cropRect.width < configuraiton.minCropRectSize.width {\n                cropRect.origin.x = touchesBegan.cropRect.maxX - configuraiton.minCropRectSize.width\n                cropRect.size.width = configuraiton.minCropRectSize.width\n            }\n            \n            if point.x < minStickPoint {\n                cropRect.origin.x = cropRectMaxFrame.minX\n                cropRect.size.width = touchesBegan.cropRect.maxX - cropRectMaxFrame.minX\n            }\n        }\n\n        /* Update UI for the crop rectange */\n        \n        layoutSubviews()\n        \n        /* Delegates */\n        \n        delegate?.cropperOverlayViewDidChangeCropRect(self, cropRect)\n    }\n    \n    override open func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {\n        \n        /* Active part */\n        \n        activeCropAreaPart = .none\n    }\n    \n    // MARK: - Instance Method\n    \n    override open func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {\n                \n        guard alpha == 1 else { return cropperView.scrollView }\n        \n        return self.point(inside: point, with: event) && getCropAreaPartContainsPoint(point) != .none\n            ? self\n            : cropperView.scrollView\n    }\n    \n    // MARK: - Match Foreground To Background\n    \n    func matchForegroundToBackgroundScrollViewOffset() {\n        imageView.frame.origin = CGPoint(\n            x: -(cropperView.scrollView.contentOffset.x + containerImageView.frame.origin.x),\n            y: -(cropperView.scrollView.contentOffset.y + containerImageView.frame.origin.y))\n    }\n    \n    func matchForegroundToBackgroundScrollViewSize() {\n        imageView.frame.size = cropperView.scrollView.contentSize\n    }\n}\n"
  },
  {
    "path": "AKImageCropperView/AKImageCropperOverlayViewConfiguration.swift",
    "content": "//\n//  AKImageCropperCropViewConfiguration.swift\n//\n//  Created by Artem Krachulov.\n//  Copyright (c) 2016 Artem Krachulov. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n// and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge, publish, distribute,\n// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or\n// substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\n// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE\n// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n// DEALINGS IN THE SOFTWARE.\n//\n\nimport UIKit\n\n/// Overlay view configuration struct.\npublic struct AKImageCropperCropViewConfiguration {\n    \n    public init() {}\n    \n    //  MARK: Crop rectangle\n    \n    /// Delay before the crop rectangle will scale to fit cropper view frame edges.\n    public var zoomingToFitDelay: TimeInterval = 1.0\n\n    /**\n     Animation options for layout transitions.\n     \n     -  duration: The duration of the transition animation, measured in seconds.     \n     -  options: Specifies the supported animation curves.\n     */\n    public var animation: (duration: TimeInterval, options: UIViewAnimationOptions) = (duration: 0.3, options: .curveEaseInOut)\n\n    /// Edges insets for crop rectangle. Static values for programmatically rotation.\n    \n    public var cropRectInsets = UIEdgeInsetsMake(20, 20, 20, 20)\n    \n    /// The smallest value for the crop rectangle sizes. Initial value of this property is 60 pixels width and 60 pixels height.\n    public var minCropRectSize: CGSize = CGSize(width: 60, height: 60)\n    \n    /// Touch view where will be drawn the corner.\n    public var cornerTouchSize: CGSize = CGSize(width: 30.0, height: 30.0)\n    \n    /**\n     Thickness for edges touch area. This touch view is centered on the edge line.\n     \n     -  vertical: Thickness for vertical edges: Left, Right.\n     -  horizontal: Thickness for horizontal edges: Top, Bottom.\n     */\n    public var edgeTouchThickness: (vertical: CGFloat, horizontal: CGFloat) = (vertical: 20.0, horizontal: 20.0)\n\n    //  MARK: Visual Appearance\n    \n    /// Overlay visual configuration.\n    public var overlay = AKImageCropperCropViewConfigurationOverlay()\n    \n    /// Edges visual configuration.\n    public var edge = AKImageCropperCropViewConfigurationEdge()\n    \n    /// Corners visual configuration.\n    public var corner = AKImageCropperCropViewConfigurationCorner()\n    \n    /// Grid visual configuration.    \n    public var grid = AKImageCropperCropViewConfigurationGrid()\n}\n"
  },
  {
    "path": "AKImageCropperView/AKImageCropperOverlayViewConfigurationCorner.swift",
    "content": "//\n//  AKImageCropperCropViewConfigurationCorner.swift\n//\n//  Created by Artem Krachulov.\n//  Copyright (c) 2016 Artem Krachulov. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n// and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge, publish, distribute,\n// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or\n// substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\n// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE\n// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n// DEALINGS IN THE SOFTWARE.\n//\n\nimport UIKit\n\n/// Corners configuration struct.\npublic struct AKImageCropperCropViewConfigurationCorner {\n\n    /// A Boolean value that determines whether the corner view is hidden.\n    public var isHidden: Bool = false\n\n    /// Line width for normal corner state.\n    public var normalLineWidth: CGFloat = 3.0\n     \n    /// Line width for highlighted corner state.\n    public var highlightedLineWidth: CGFloat = 3.0\n    \n    /// Size for normal corner state.\n    public var normaSize: CGSize = CGSize(width: 20, height: 20)\n    \n    /// Size for highlighted corner state.\n    public var highlightedSize: CGSize = CGSize(width: 30, height: 30)\n    \n    /// Line color for normal corner state.\n    public var normalLineColor: UIColor = .white\n    \n    /// Line color for highlighted corner state.    \n    public var highlightedLineColor: UIColor = .white\n}\n"
  },
  {
    "path": "AKImageCropperView/AKImageCropperOverlayViewConfigurationEdge.swift",
    "content": "//\n//  AKImageCropperCropViewConfigurationEdge.swift\n//\n//  Created by Artem Krachulov.\n//  Copyright (c) 2016 Artem Krachulov. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n// and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge, publish, distribute,\n// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or\n// substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\n// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE\n// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n// DEALINGS IN THE SOFTWARE.\n//\n\nimport UIKit\n\n/// Edges configuration struct.\npublic struct AKImageCropperCropViewConfigurationEdge {\n   \n    /// A Boolean value that determines whether the edge view is hidden.\n    public var isHidden: Bool = false\n    \n    /// Line width for normal edge state.\n    public var normalLineWidth: CGFloat = 1.0\n    \n    /// Line width for highlighted edge state.\n    public var highlightedLineWidth: CGFloat = 3.0\n    \n    /// Line color for normal edge state.\n    public var normalLineColor: UIColor = .white\n   \n    /// Line color for highlighted edge state.\n    public var highlightedLineColor: UIColor = .white\n}\n"
  },
  {
    "path": "AKImageCropperView/AKImageCropperOverlayViewConfigurationGrid.swift",
    "content": "//\n//  AKImageCropperCropViewConfigurationGrid.swift\n//\n//  Created by Artem Krachulov.\n//  Copyright (c) 2016 Artem Krachulov. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n// and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge, publish, distribute,\n// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or\n// substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\n// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE\n// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n// DEALINGS IN THE SOFTWARE.\n//\n\nimport UIKit\n\n/// Grid visual configuration struct.\npublic struct AKImageCropperCropViewConfigurationGrid {\n    \n    /// A Boolean value that determines whether the edge view is hidden.\n    public var isHidden: Bool = false\n    \n    /// Hide grid after user interaction.\n    public var alwaysShowGrid: Bool = false\n    \n    /**\n     The number of vertical and horizontal lines inside the crop rectangle.\n     \n     -  vertical: Vertical lines count.     \n     -  horizontal: Horizontal lines count.\n     */    \n    public var linesCount: (vertical: Int, horizontal: Int) = (vertical: 2, horizontal: 2)\n    \n    /// Vertical and horizontal lines width.\n    public var linesWidth: CGFloat = 1.0\n   \n    /// Vertical and horizontal lines color.\n    public var linesColor: UIColor = UIColor.white.withAlphaComponent(0.5)\n}\n"
  },
  {
    "path": "AKImageCropperView/AKImageCropperOverlayViewConfigurationOverlay.swift",
    "content": "//\n//  AKImageCropperCropViewConfigurationOverlay.swift\n//\n//  Created by Artem Krachulov.\n//  Copyright (c) 2016 Artem Krachulov. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n// and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge, publish, distribute,\n// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or\n// substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\n// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE\n// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n// DEALINGS IN THE SOFTWARE.\n//\n\nimport UIKit\n\n/// Overlay configuration struct.\npublic struct AKImageCropperCropViewConfigurationOverlay {\n    \n    /// The view’s background color.\n    public var backgroundColor: UIColor = UIColor.black.withAlphaComponent(0.5)\n    \n    /// A Boolean value that determines whether the blur effect is enable.\n    ///\n    /// The blur effect added over overlay view. The effect will disappear before user interaction will start. After manipulations, the effect will revert to the initial state.\n    public var isBlurEnabled: Bool = true\n    \n    /// The intensity of the blur effect.\n    public var blurStyle: UIBlurEffectStyle = .dark\n    \n    /// The blur effect alpha value.\n    public var blurAlpha: CGFloat = 0.6\n}\n"
  },
  {
    "path": "AKImageCropperView/AKImageCropperOverlayViewTouchState.swift",
    "content": "//\n//  AKImageCropperCropViewTouchState.swift\n//\n//  Created by Artem Krachulov.\n//  Copyright (c) 2016 Artem Krachulov. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n// and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge, publish, distribute,\n// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or\n// substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\n// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE\n// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n// DEALINGS IN THE SOFTWARE.\n//\n\n/// User interaction state for edge or corner.\npublic enum AKImageCropperCropViewTouchState {\n\n    /// Default, relase\n    case normal\n\n    /// Press, touch, etc.    \n    case highlighted\n}\n"
  },
  {
    "path": "AKImageCropperView/AKImageCropperScrollView.swift",
    "content": "//\n//  AKImageCropperScrollView.swift\n//  AKImageCropperView\n//\n//  Created by Artem Krachulov on 12/17/16.\n//  Copyright © 2016 Artem Krachulov. All rights reserved.\n//\n\nimport UIKit\n\nfinal class AKImageCropperScrollView: UIScrollView {\n    \n    // MARK: -\n    // MARK: ** Properties **\n    \n    /** Return visible rect of an UIScrollView's content */\n    \n    open var visibleRect: CGRect {\n        return CGRect(\n            x       : contentInset.left,\n            y       : contentInset.top,\n            width   : frame.size.width  - contentInset.left - contentInset.right,\n            height  : frame.size.height - contentInset.top - contentInset.bottom)\n    }\n    \n    /** Returns scaled visible rect of an UIScrollView's content  */\n    \n    open var scaledVisibleRect: CGRect {\n        return CGRect(\n            x       : (contentOffset.x + contentInset.left) / zoomScale,\n            y       : (contentOffset.y + contentInset.top) / zoomScale,\n            width   : visibleRect.size.width / zoomScale,\n            height  : visibleRect.size.height / zoomScale)\n    }\n    \n    // MARK: -\n    // MARK: ** Initialization OBJECTS(VIEWS) & theirs parameters **\n    \n    fileprivate lazy var imageView: UIImageView! = {\n        let view = UIImageView()\n        return view\n    }()\n    \n    open var image: UIImage! {\n        didSet {\n            \n            /* Prepare scroll view to changing the image */\n            \n            maximumZoomScale = 1\n            minimumZoomScale = 1\n            zoomScale = 1\n            \n            /* Update an image view */\n            \n            imageView.image = image\n            imageView.frame.size = image.size\n            \n            contentSize = image.size\n        }\n    }\n    \n    //  MARK: - Initialization\n    \n    /** Returns an scroll view initialized object. */\n    \n    init() {\n        super.init(frame: .zero)\n        \n        alwaysBounceVertical = true\n        alwaysBounceHorizontal = true\n        showsVerticalScrollIndicator = false\n        showsHorizontalScrollIndicator = false\n        \n        addSubview(imageView)\n    }\n    \n    required public init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n}\n"
  },
  {
    "path": "AKImageCropperView/AKImageCropperView.h",
    "content": "//\n//  AKImageCropperView.h\n//  AKImageCropperView\n//\n//  Created by Artem Krachulov on 12/13/16.\n//  Copyright © 2016 Artem Krachulov. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n//! Project version number for AKImageCropperView.\nFOUNDATION_EXPORT double AKImageCropperViewVersionNumber;\n\n//! Project version string for AKImageCropperView.\nFOUNDATION_EXPORT const unsigned char AKImageCropperViewVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <AKImageCropperView/PublicHeader.h>\n\n\n"
  },
  {
    "path": "AKImageCropperView/AKImageCropperView.swift",
    "content": "//\n//  AKImageCropperView.swift\n//\n//  Created by Artem Krachulov.\n//  Copyright (c) 2016 Artem Krachulov. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n// and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n// including without limitation the rights to use, copy, modify, merge, publish, distribute,\n// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or\n// substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\n// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE\n// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n// DEALINGS IN THE SOFTWARE.\n//\n\nimport UIKit\n\ntypealias CGPointPercentage = CGPoint\n\nopen class AKImageCropperView: UIView, UIScrollViewDelegate, UIGestureRecognizerDelegate, AKImageCropperOverlayViewDelegate {\n    \n    /** Current rotation angle */\n    \n    fileprivate var angle: Double = 0.0\n    \n    /** Scroll view minimum edge insets (current value) */\n    \n    fileprivate var minEdgeInsets: UIEdgeInsets = .zero\n    \n    /** Reversed frame direct to current rotation angle */\n    \n    fileprivate var reversedRect: CGRect {\n        return CGRect(\n            origin  : .zero,\n            size    : ((angle / M_PI_2).truncatingRemainder(dividingBy: 2)) == 1\n                ? CGSize(width: frame.size.height, height: frame.size.width)\n                : frame.size)\n    }\n    \n    /** Reversed minimum edge insets direct to current rotation angle */\n    \n    fileprivate var reversedEdgeInsets: UIEdgeInsets {\n        \n        var newEdgeInsets: UIEdgeInsets\n        \n        switch angle {\n        case M_PI_2:\n            newEdgeInsets = UIEdgeInsetsMake(\n                minEdgeInsets.right,\n                minEdgeInsets.top,\n                minEdgeInsets.left,\n                minEdgeInsets.bottom)\n        case M_PI:\n            newEdgeInsets = UIEdgeInsetsMake(\n                minEdgeInsets.bottom,\n                minEdgeInsets.right,\n                minEdgeInsets.top,\n                minEdgeInsets.left)\n        case M_PI_2 * 3:\n            newEdgeInsets = UIEdgeInsetsMake(\n                minEdgeInsets.left,\n                minEdgeInsets.bottom,\n                minEdgeInsets.right,\n                minEdgeInsets.top)\n        default:\n            newEdgeInsets = minEdgeInsets\n        }\n        \n        return newEdgeInsets\n    }\n    \n    /** Reversed frame + edgeInsets direct to current rotation angle */\n    \n    var reversedFrameWithInsets: CGRect {\n        return UIEdgeInsetsInsetRect(reversedRect, reversedEdgeInsets)\n    }\n    \n    // MARK: -\n    // MARK: ** Saved properties **\n    \n    fileprivate struct SavedProperty {\n        \n        var scaleAspectRatio: CGFloat!\n        var contentOffset: CGPoint!\n        var contentOffsetPercentage: CGPoint!\n        var cropRectSize: CGSize!\n        \n        init() {\n            scaleAspectRatio = 1.0\n            contentOffset = .zero\n            contentOffsetPercentage = .zero\n            cropRectSize = .zero\n        }\n        \n        mutating func save(scrollView: AKImageCropperScrollView) {\n            \n            scaleAspectRatio = scrollView.zoomScale / scrollView.minimumZoomScale\n            \n            contentOffset = CGPoint(\n                x: scrollView.contentOffset.x + scrollView.contentInset.left,\n                y: scrollView.contentOffset.y + scrollView.contentInset.top)\n\n            let contentSize = CGSize(\n                width   : (scrollView.contentSize.width - scrollView.visibleRect.width).ic_roundTo(precision: 3),\n                height  : (scrollView.contentSize.height - scrollView.visibleRect.height).ic_roundTo(precision: 3))\n\n            contentOffsetPercentage = CGPointPercentage(\n                x: (contentOffset.x > 0 && contentSize.width != 0)\n                    ? ic_round(x: contentOffset.x / contentSize.width, multiplier: 0.005)\n                    : 0,\n                y: (contentOffset.y > 0 && contentSize.height != 0)\n                    ? ic_round(x: contentOffset.y / contentSize.height, multiplier: 0.005)\n                    : 0)\n            \n            cropRectSize = scrollView.visibleRect.size\n        }\n    }\n    \n    /** Saved Scroll View parameters before complex layout animation */\n    \n    fileprivate var savedProperty = SavedProperty()\n    \n    // MARK: Accessing the Displayed Images\n    \n    /** The image displayed in the image cropper view. Default is nil. */\n    \n    open var image: UIImage? {\n        didSet {\n            \n            guard let image = image else {\n                return\n            }\n            \n            scrollView.image = image\n            overlayView?.image = image\n            \n            reset()\n        }\n    }\n    \n    /** Cropperd image in the specified crop rectangle */\n    \n    open var croppedImage: UIImage? {\n        return image?.ic_imageInRect(scrollView.scaledVisibleRect)?.ic_rotateByAngle(angle)\n    }\n    \n    // MARK: States\n    \n    /** Returns the image edited state flag. */\n    \n    open var isEdited: Bool {\n        \n        guard let image = image else {\n            return false\n        }\n\n        let fitScaleMultiplier = ic_CGSizeFitScaleMultiplier(image.size, relativeToSize: reversedFrameWithInsets.size)\n        \n        return angle != 0 || fitScaleMultiplier != scrollView.minimumZoomScale || fitScaleMultiplier != scrollView.zoomScale\n    }\n    \n    /** Determines the overlay view current state. Default is false. */\n    \n    open private(set) var isOverlayViewActive: Bool = false\n    \n    fileprivate var layoutByImage: Bool = true\n    \n    /** Сompletion blocker. */\n    \n    fileprivate var isAnimation: Bool = false\n    \n    // MARK: Managing the Delegate\n    \n    /** The delegate of the cropper view object. */\n    \n    weak open var delegate: AKImageCropperViewDelegate?\n\n    // MARK: - \n    // MARK: ** Initialization OBJECTS(VIEWS) & theirs parameters **\n    \n    // MARK: Rotate view\n    \n    fileprivate lazy var rotateView: UIView! = {\n        let view = UIView()\n        view.clipsToBounds = true\n        return view\n    }()\n    \n    // MARK: Scroll view\n\n    var scrollView: AKImageCropperScrollView!\n    \n    // MARK: Overlay Crop view\n    \n    open var overlayView: AKImageCropperOverlayView? {\n        willSet  {\n            \n            if overlayView != nil {\n                overlayView?.removeFromSuperview()\n            }\n            \n            if newValue != nil {\n                newValue?.delegate = self\n                newValue?.cropperView = self\n                rotateView.addSubview(newValue!)\n            }\n            \n            layoutSubviews()\n        }\n    }\n    \n    // MARK: - Initializing an Image Cropper View\n    \n    required public init?(coder aDecoder: NSCoder) {\n        super.init(coder: aDecoder)\n        \n        initialize()\n    }\n    \n    override public init(frame: CGRect) {\n        super.init(frame: frame)\n        \n        initialize()\n    }\n    \n    /**\n     Returns an image cropper view initialized with the specified image.\n     \n     - Parameter image: The initial image to display in the image cropper view.\n     */\n    \n    public init(image: UIImage?) {\n        super.init(frame:CGRect.zero)\n        \n        initialize()\n        \n        self.image = image\n    }\n    \n    fileprivate func initialize() {\n        \n        /*\n         Create views layout.\n         Step by step\n         \n         1. Scroll view ‹‹ Image view\n         */\n\n        scrollView = AKImageCropperScrollView()\n        scrollView.delegate = self\n        rotateView.addSubview(scrollView)\n        \n        /* 2. Overlay view with crop rectangle */\n        \n        overlayView = AKImageCropperOverlayView()\n        \n        /* 3. Rotate view */\n        \n        addSubview(rotateView)\n        \n        /**\n         Add Observers\n         To controll all parameters changing and pass them to foreground image view\n         */\n        \n        initObservers()\n        \n        let pressGesture = UILongPressGestureRecognizer(target: self, action: #selector(pressGestureAction(_ :)))\n        pressGesture.minimumPressDuration = 0\n        pressGesture.cancelsTouchesInView = false\n        pressGesture.delegate = self\n        addGestureRecognizer(pressGesture)\n    }\n    \n    @objc fileprivate func pressGestureAction(_ gesture: UITapGestureRecognizer) {\n        if gesture.state == .began {\n            beforeInteraction()\n        } else if gesture.state == .cancelled || gesture.state == .ended {\n            afterInteraction()\n        }\n    }\n    \n    // MARK: - UIGestureRecognizerDelegate\n    \n    public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {\n        return true\n    }\n \n    deinit {\n        removeObservers()\n        \n        #if AKImageCropperViewDEBUG\n            print(\"deinit AKImageCropperView\")\n        #endif\n    }\n    \n    // MARK: - Observe Scroll view values\n    \n    fileprivate func initObservers() {\n        for forKeyPath in [\"contentOffset\", \"contentSize\"] {\n            scrollView.addObserver(self, forKeyPath: forKeyPath, options: [.new, .old], context: nil)\n        }\n    }\n    \n    open override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {\n        \n        guard let keyPath = keyPath else {\n            return\n        }\n        \n        switch keyPath {\n        case \"contentOffset\":\n            if let _ = change![NSKeyValueChangeKey.newKey] {\n                 overlayView?.matchForegroundToBackgroundScrollViewOffset()\n            }\n        case \"contentSize\":\n            if let _ = change![NSKeyValueChangeKey.newKey] {\n                overlayView?.matchForegroundToBackgroundScrollViewSize()\n            }\n        default: ()\n        }\n    }\n    \n    fileprivate func removeObservers() {\n        for forKeyPath in [\"contentOffset\", \"contentSize\"] {\n            scrollView.removeObserver(self, forKeyPath: forKeyPath)\n        }\n    }\n    \n    // MARK: - Life cycle\n    \n    override open func layoutSubviews() {\n        super.layoutSubviews()\n     \n        layoutSubviews(byImage: layoutByImage)\n    }\n    \n    func layoutSubviews(byImage: Bool) {\n        \n        rotateView.frame = CGRect(origin: .zero, size: self.frame.size)\n        \n        let frame = reversedRect\n        \n        let reversedFrameWithInsetsSize = reversedFrameWithInsets.size\n        \n        if byImage {\n            \n            /* Zoom */\n            \n            let fitScaleMultiplier = image == nil\n                ? 1\n                : ic_CGSizeFitScaleMultiplier(image!.size, relativeToSize: reversedFrameWithInsetsSize)\n            \n            \n            scrollView.maximumZoomScale = fitScaleMultiplier * 1000\n            scrollView.minimumZoomScale = fitScaleMultiplier\n            scrollView.zoomScale = fitScaleMultiplier * savedProperty.scaleAspectRatio\n            \n        } else {\n            \n            /* Zoom */\n            \n            let fitScaleMultiplier = ic_CGSizeFitScaleMultiplier(scrollView.visibleRect.size, relativeToSize: reversedFrameWithInsetsSize)\n            \n            scrollView.maximumZoomScale *= fitScaleMultiplier\n            scrollView.minimumZoomScale *= fitScaleMultiplier\n            scrollView.zoomScale *= fitScaleMultiplier\n            \n            /* Content inset */\n            \n            var size: CGSize\n            \n            if overlayView?.alpha == 1 {\n                \n                size = CGSize(\n                    width   : scrollView.visibleRect.size.width * fitScaleMultiplier,\n                    height  : scrollView.visibleRect.size.height * fitScaleMultiplier)\n                \n            } else {\n                \n                size = ic_CGSizeFits(scrollView.contentSize, minSize: .zero, maxSize: reversedFrameWithInsetsSize)\n            }\n            \n            scrollView.contentInset = centeredInsets(from: size, to: reversedFrameWithInsetsSize)\n            \n            /* Content offset */\n            \n            let savedFitScaleMultiplier = ic_CGSizeFitScaleMultiplier(savedProperty.cropRectSize, relativeToSize: reversedFrameWithInsetsSize)\n            \n            var contentOffset = CGPoint(\n                x: savedProperty.contentOffset.x * savedFitScaleMultiplier,\n                y: savedProperty.contentOffset.y * savedFitScaleMultiplier)\n            \n            contentOffset.x -= scrollView.contentInset.left\n            contentOffset.y -= scrollView.contentInset.top\n            \n            scrollView.contentOffset = contentOffset\n        }\n        \n        scrollView.frame = frame\n        \n        overlayView?.frame = frame\n        overlayView?.cropRect = scrollView.visibleRect\n        overlayView?.layoutSubviews()\n    }\n\n    // MARK: -\n    // MARK: ** Actions **\n    \n    // MARK: Overlay actions\n    \n    /**\n     Show the overlay view with crop rectangle.\n     \n     - Parameter duration: The total duration of the animations, measured in seconds. If you specify a negative value or 0, the changes are made without animating them. Default value is 0.\n     \n     - Parameter options: A mask of options indicating how you want to perform the animations. For a list of valid constants, see UIViewAnimationOptions. Default value is .curveEaseInOut.\n     \n     - Parameter completion: A block object to be executed when the animation sequence ends. This block has no return value and takes a single Boolean argument that indicates whether or not the animations actually finished before the completion handler was called. If the duration of the animation is 0, this block is performed at the beginning of the next run loop cycle. This parameter may be NULL.\n     */\n    \n    open func showOverlayView(animationDuration duration: TimeInterval = 0, options: UIViewAnimationOptions = .curveEaseInOut, completion: ((Bool) -> Void)? = nil) {\n        \n        guard let image = image, let overlayView = overlayView, !isOverlayViewActive && !isAnimation else {\n            return\n        }\n        \n        minEdgeInsets = overlayView.configuraiton.cropRectInsets\n        savedProperty.save(scrollView: scrollView)\n        cancelZoomingTimer()\n        \n        let _animations: () -> Void = { _ in\n            \n            self.layoutSubviews()\n            \n            // Update scroll view content offsets using active zooming scale and insets.\n            \n            self.scrollView.contentOffset = self.contentOffset(from: self.savedProperty.contentOffsetPercentage)\n        }\n        \n        let _completion: (Bool) -> Void = { isFinished in\n            \n            // Update zoom relative to crop rext\n            \n            let fillScaleMultiplier = ic_CGSizeFillScaleMultiplier(image.size, relativeToSize: overlayView.cropRect.size)\n            \n            self.scrollView.maximumZoomScale = fillScaleMultiplier * 1000\n            self.scrollView.minimumZoomScale = fillScaleMultiplier\n            \n            /* */\n            \n            self.isAnimation = false\n            self.isOverlayViewActive = true\n            \n            completion?(isFinished)\n        }\n        \n        /* Show */\n        \n        layoutByImage = false\n        \n        isAnimation = true\n        \n        if duration == 0 {\n            _animations()\n            overlayView.alpha = 1\n            _completion(true)\n        } else {\n            UIView.animate(withDuration: duration, delay: 0, options: options, animations: _animations, completion: { _ in\n                UIView.animate(withDuration: duration, delay: 0, options: options, animations: {\n                    overlayView.alpha = 1\n                }, completion: _completion)\n            })\n        }\n    }\n    \n    /**\n     Hide the overlay view with crop rectangle.\n     \n     - Parameter duration: The total duration of the animations, measured in seconds. If you specify a negative value or 0, the changes are made without animating them. Default value is 0.\n     \n     - Parameter options: A mask of options indicating how you want to perform the animations. For a list of valid constants, see UIViewAnimationOptions. Default value is .curveEaseInOut.\n     \n     - Parameter completion: A block object to be executed when the animation sequence ends. This block has no return value and takes a single Boolean argument that indicates whether or not the animations actually finished before the completion handler was called. If the duration of the animation is 0, this block is performed at the beginning of the next run loop cycle. This parameter may be NULL.\n     */\n    \n    open func hideOverlayView(animationDuration duration: TimeInterval = 0, options: UIViewAnimationOptions = .curveEaseInOut, completion: ((Bool) -> Void)? = nil) {\n        \n        guard let image = image, let overlayView = overlayView, isOverlayViewActive && !isAnimation else {\n            return\n        }\n        \n        minEdgeInsets = .zero\n        savedProperty.save(scrollView: scrollView)\n        cancelZoomingTimer()\n   \n        isAnimation = true\n        \n        let _animations: () -> Void = { _ in\n            \n            self.layoutSubviews()\n            \n            /**\n             Update scroll view content offsets\n             using active zooming scale and insets.\n             */\n            \n            self.scrollView.contentOffset = self.contentOffset(from: self.savedProperty.contentOffsetPercentage)\n        }\n        \n        let _completion: (Bool) -> Void = { isFinished in\n\n            // Update zoom relative to crop rext\n            \n            let fitScaleMultiplier = ic_CGSizeFitScaleMultiplier(image.size, relativeToSize: self.reversedFrameWithInsets.size)\n \n            self.scrollView.maximumZoomScale = fitScaleMultiplier * 1000\n            self.scrollView.minimumZoomScale = fitScaleMultiplier\n            \n            /* */\n            \n            self.isAnimation = false\n            self.isOverlayViewActive = false\n            self.layoutByImage = false\n            \n            completion?(isFinished)\n        }\n        \n        if duration == 0 {\n            overlayView.alpha = 0\n            _animations()\n            _completion(true)\n        } else {\n            UIView.animate(withDuration: duration, delay: 0, options: options, animations: {\n                overlayView.alpha = 0\n            }, completion: { _ in\n                UIView.animate(withDuration: duration, delay: 0, options: options, animations: _animations, completion: _completion)\n            })\n        }\n    }\n    \n    // MARK: Rotate\n    \n    /**\n     Rotate the image on the angle in multiples of 90 degrees (M_PI_2).\n     \n     - Parameter angle: Rotation angle. The angle a multiple of 90 degrees (M_PI_2).\n     \n     - Parameter duration: The total duration of the animations, measured in seconds. If you specify a negative value or 0, the changes are made without animating them. Default value is 0.\n     \n     - Parameter options: A mask of options indicating how you want to perform the animations. For a list of valid constants, see UIViewAnimationOptions. Default value is .curveEaseInOut.\n     \n     - Parameter completion: A block object to be executed when the animation sequence ends. This block has no return value and takes a single Boolean argument that indicates whether or not the animations actually finished before the completion handler was called. If the duration of the animation is 0, this block is performed at the beginning of the next run loop cycle. This parameter may be NULL.\n     */\n    \n    open func rotate(_ angle: Double, withDuration duration: TimeInterval = 0, options: UIViewAnimationOptions = .curveEaseInOut, completion: ((Bool) -> Void)? = nil) {\n        \n        guard angle.truncatingRemainder(dividingBy: M_PI_2) == 0 else {\n            return\n        }\n        \n        self.angle = angle\n        savedProperty.save(scrollView: scrollView)\n        \n        let _animations: () -> Void = { _ in\n            \n            self.rotateView.transform = CGAffineTransform(rotationAngle: CGFloat(angle))\n            self.layoutSubviews()\n        }\n        \n        let _completion: (Bool) -> Void = { isFinished in\n            completion?(isFinished)\n        }\n        \n        if duration == 0 {\n            _animations()\n            _completion(true)\n        } else {\n            UIView.animate(withDuration: duration, delay: 0, options: options, animations: _animations, completion: _completion)\n        }\n    }\n    \n    // MARK: Reset\n    \n    /**\n     Return Cropper view to the initial state.\n     \n     - Parameter duration: The total duration of the animations, measured in seconds. If you specify a negative value or 0, the changes are made without animating them. Default value is 0.\n     \n     - Parameter options: A mask of options indicating how you want to perform the animations. For a list of valid constants, see UIViewAnimationOptions. Default value is .curveEaseInOut.\n     \n     - Parameter completion: A block object to be executed when the animation sequence ends. This block has no return value and takes a single Boolean argument that indicates whether or not the animations actually finished before the completion handler was called. If the duration of the animation is 0, this block is performed at the beginning of the next run loop cycle. This parameter may be NULL.\n     */\n    \n    open func reset(animationDuration duration: TimeInterval = 0, options: UIViewAnimationOptions = .curveEaseInOut, completion: ((Bool) -> Void)? = nil) {\n        \n        guard !isAnimation else {\n            return\n        }\n\n        savedProperty = SavedProperty()\n        angle = 0\n        cancelZoomingTimer()\n        \n        let _animations: () -> Void = { _ in\n            \n            self.rotateView.transform = CGAffineTransform.identity\n            \n            let _layoutByImage = self.layoutByImage\n            self.layoutByImage = true\n            self.layoutSubviews()\n            self.layoutByImage = _layoutByImage\n            \n        }\n        \n        let _completion: (Bool) -> Void = { isFinished in\n            \n            self.isAnimation = false\n            completion?(isFinished)\n        }\n        \n        isAnimation = true\n        if duration == 0 {\n            _animations()\n            _completion(true)\n        } else {\n            UIView.animate(withDuration: duration, delay: 0, options: options, animations: _animations, completion: _completion)\n        }\n    }\n\n    // MARK: - Edge insets zooming\n    \n    fileprivate var zoomingTimer: Timer?\n    \n    fileprivate func startZoomingTimer() {\n        \n        guard let overlayView = overlayView else {\n            return\n        }\n\n        cancelZoomingTimer()\n        \n        zoomingTimer = Timer.scheduledTimer(timeInterval: overlayView.configuraiton.zoomingToFitDelay, target: self, selector: #selector(zoomAction), userInfo: nil, repeats: false)\n    }\n    \n    @objc fileprivate func zoomAction() {\n        \n        guard let overlayView = overlayView else {\n            return\n        }\n        \n        savedProperty.save(scrollView: scrollView)\n        \n        overlayView.showGrid(false)\n        overlayView.showOverlayBlur(true)\n\n        UIView.animate(withDuration: overlayView.configuraiton.animation.duration, delay: 0, options: overlayView.configuraiton.animation.options, animations: {\n            self.layoutSubviews()\n        })\n    }\n    \n    fileprivate func cancelZoomingTimer() {\n        zoomingTimer?.invalidate()\n        zoomingTimer = nil\n    }\n    \n    // MARK: - After interaction actions    \n    \n    fileprivate func beforeInteraction() {\n        \n        guard let overlayView = overlayView, overlayView.alpha == 1.0  else {\n            return\n        }\n        \n        cancelZoomingTimer()\n        \n        overlayView.showGrid(true)\n        overlayView.showOverlayBlur(false)\n    }\n    \n    fileprivate func afterInteraction() {\n        \n        guard let overlayView = overlayView, overlayView.alpha == 1.0  else {\n            return\n        }\n        \n        startZoomingTimer()\n\n        savedProperty.save(scrollView: scrollView)\n    }\n    \n    // MARK: - Helper methods\n    \n    private func centeredInsets(from size: CGSize, to relativeSize: CGSize) -> UIEdgeInsets {\n        \n        let center = ic_CGPointCenters(size, relativeToSize: relativeSize)\n        \n        // Fix insets direct to orientation\n        \n        return UIEdgeInsetsMake(\n            center.y + minEdgeInsets.top,\n            center.x + minEdgeInsets.left,\n            center.y + minEdgeInsets.bottom,\n            center.x + minEdgeInsets.right)\n    }\n    \n    private func contentOffset(from savedContentOffsetPercentage: CGPointPercentage) -> CGPoint {\n\n        var contentOffset = CGPoint(\n            x: scrollView.contentInset.left > minEdgeInsets.left\n                ? 0\n                : ((scrollView.contentSize.width - reversedFrameWithInsets.size.width) * savedContentOffsetPercentage.x),\n            y: scrollView.contentInset.top > minEdgeInsets.left\n                ? 0\n                : ((scrollView.contentSize.height - reversedFrameWithInsets.size.height) * savedContentOffsetPercentage.y))\n        \n        contentOffset.x -= scrollView.contentInset.left\n        contentOffset.y -= scrollView.contentInset.top\n        \n        return contentOffset\n    }\n    \n    //  MARK: - AKImageCropperOverlayViewDelegate\n    \n    func cropperOverlayViewDidChangeCropRect(_ view: AKImageCropperOverlayView, _ cropRect: CGRect) {\n        \n        scrollView.contentInset = UIEdgeInsetsMake(\n            cropRect.origin.y,\n            cropRect.origin.x,\n            view.frame.size.height - cropRect.size.height - cropRect.origin.y,\n            view.frame.size.width - cropRect.size.width - cropRect.origin.x)\n        \n        if cropRect.size.height > scrollView.contentSize.height || cropRect.size.width > scrollView.contentSize.width {\n            \n            let fillScaleMultiplier = ic_CGSizeFillScaleMultiplier(scrollView.contentSize, relativeToSize: cropRect.size)\n            \n            scrollView.maximumZoomScale *= fillScaleMultiplier\n            scrollView.minimumZoomScale *= fillScaleMultiplier\n            scrollView.zoomScale        *= fillScaleMultiplier\n        }\n    }\n    \n    // MARK: - UIScrollViewDelegate\n    \n    public func viewForZooming(in scrollView: UIScrollView) -> UIView? {        \n        return scrollView.subviews.first\n    }\n    \n    public func scrollViewDidZoom(_ scrollView: UIScrollView) {\n        \n        guard layoutByImage else {\n            return\n        }\n  \n        let size = ic_CGSizeFits(scrollView.contentSize, minSize: .zero, maxSize: reversedFrameWithInsets.size)\n        \n        scrollView.contentInset = centeredInsets(from: size, to: reversedFrameWithInsets.size)\n    }\n    \n    public func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) {\n        beforeInteraction()\n    }\n    \n    public func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {\n        afterInteraction()\n    }\n    \n    public func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {\n        beforeInteraction()\n    }\n    \n    public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {\n        afterInteraction()\n    }\n}\n\n//  MARK: - AKImageCropperViewDelegate\n\npublic protocol AKImageCropperViewDelegate : class {\n    \n    /**\n     Tells the delegate that crop frame was changed.\n     \n     - Parameter view : The image cropper view.\n     - Parameter rect : New crop rectangle origin and size.\n     */\n    \n    func imageCropperViewDidChangeCropRect(view: AKImageCropperView, cropRect rect: CGRect)\n}\n\npublic extension AKImageCropperViewDelegate {    \n    func imageCropperViewDidChangeCropRect(view: AKImageCropperView, cropRect rect: CGRect) {}\n}\n"
  },
  {
    "path": "AKImageCropperView/IC_CGFloatExtension.swift",
    "content": "//\n//  ic_CGFloatExtension.swift\n//  AKImageCropperView\n//\n//  Created by Artem Krachulov.\n//  Copyright (c) 2016 Artem Krachulov. All rights reserved.\n//\n\nimport UIKit\n\nextension CGFloat {\n    \n    /** Rounds the value to the nearest with precision. */\n\n    public func ic_roundTo(precision: Int) -> CGFloat {\n        let divisor = pow(10.0, CGFloat(precision))\n        return (self * divisor).rounded() / divisor\n    }\n}\n\n/** Rounds the value to the nearest with multiplier. */\n\npublic func ic_round(x: CGFloat, multiplier: CGFloat) -> CGFloat {\n    return multiplier * round(x / multiplier)\n}\n"
  },
  {
    "path": "AKImageCropperView/IC_CGPointExtension.swift",
    "content": "//\n//  IC_CGPointExtension.swift\n//  AKImageCropperView\n//\n//  Created by Artem Krachulov.\n//  Copyright (c) 2016 Artem Krachulov. All rights reserved.\n//\n\nimport Foundation\n\n/** Return centered origin value relative to other size . */\n\nfunc ic_CGPointCenters(_ size1: CGSize, relativeToSize size2: CGSize) -> CGPoint {\n    return CGPoint(x: size2.width / 2 - size1.width / 2, y: size2.height / 2 - size1.height / 2)\n}\n\n"
  },
  {
    "path": "AKImageCropperView/IC_CGSizeExtensions.swift",
    "content": "//\n//  IC_CGSizeExtensions.swift\n//  AKImageCropperView\n//\n//  Created by Artem Krachulov.\n//  Copyright (c) 2016 Artem Krachulov. All rights reserved.\n//\n\nimport Foundation\n\n/** Returns fill scale value relative to target size with aspect ratio. */\n\nfunc ic_CGSizeFitScaleMultiplier(_ size1: CGSize, relativeToSize size2: CGSize) -> CGFloat {\n    \n    guard size1.width != 0 && size1.height != 0 else { return 1.0 }\n    \n    return min(size2.height / size1.height, size2.width / size1.width)\n}\n\n/** Returns fill scale value relative to target size with aspect ratio. */\n\nfunc ic_CGSizeFillScaleMultiplier(_ size1: CGSize, relativeToSize size2: CGSize) -> CGFloat {\n    \n    guard size1.width != 0 && size1.height != 0 else { return 1.0 }\n    \n    return max(size2.height / size1.height, size2.width / size1.width)\n}\n\n/** Returns size that fits min and max sizes. */\n\nfunc ic_CGSizeFits(_ size: CGSize, minSize: CGSize, maxSize: CGSize) -> CGSize {\n    \n    var size = size\n    \n    if size.width > maxSize.width {\n        size.width = maxSize.width\n    }\n    \n    if size.height > maxSize.height {\n        size.height = maxSize.height\n    }\n    \n    if size.width < minSize.width {\n        size.width = minSize.width\n    }\n    \n    if size.height < minSize.height {\n        size.height = minSize.height\n    }\n    \n    return size\n}\n"
  },
  {
    "path": "AKImageCropperView/IC_UIImageExtensions.swift",
    "content": "//\n//  IC_UIImageExtensions.swift\n//  AKImageCropperView\n//\n//  Created by Artem Krachulov.\n//  Copyright (c) 2016 Artem Krachulov. All rights reserved.\n//\n\nimport Foundation\n\nextension UIImage {\n    \n    /** Returns image cropped from selected rectangle. */\n    \n    func ic_imageInRect(_ rect: CGRect) -> UIImage? {\n        \n        UIGraphicsBeginImageContext(rect.size)\n        \n        // Create the bitmap context\n        \n        guard let context = UIGraphicsGetCurrentContext() else {\n            return nil\n        }\n        \n        // Sets the clipping path to the intersection of the current clipping path with the area defined by the specified rectangle.\n        \n        context.clip(to: CGRect(origin: .zero, size: rect.size))\n        \n        self.draw(in: CGRect(origin: CGPoint(x: -rect.origin.x, y: -rect.origin.y), size: self.size))\n        \n        // Returns an image based on the contents of the current bitmap-based graphics context.\n        \n        let contextImage = UIGraphicsGetImageFromCurrentImageContext()\n        \n        UIGraphicsEndImageContext()\n        \n        return contextImage\n    }\n    \n    /** Returns image rotated by specified angle. */\n    \n    func ic_rotateByAngle(_ angle: Double) -> UIImage? {\n        \n        // Calculate the size of the rotated view's containing box for our drawing space\n        \n        let rotatedViewBox = UIView(frame: CGRect(origin: .zero, size: self.size))\n        rotatedViewBox.transform = CGAffineTransform(rotationAngle: CGFloat(angle))\n        \n        let rotatedSize = rotatedViewBox.frame.size\n        \n        UIGraphicsBeginImageContext(rotatedSize)\n        \n        // Create the bitmap context\n        \n        guard let context = UIGraphicsGetCurrentContext() else {\n            return nil\n        }\n        \n        context.translateBy(x: rotatedSize.width / 2.0, y: rotatedSize.height / 2.0)\n        context.rotate(by: CGFloat(angle))\n        \n        self.draw(in: CGRect(origin: CGPoint(x: -self.size.width / 2, y: -self.size.height / 2), size: self.size))\n        \n        // Returns an image based on the contents of the current bitmap-based graphics context.\n        let contextImage = UIGraphicsGetImageFromCurrentImageContext()\n        \n        UIGraphicsEndImageContext()\n        \n        return contextImage\n    }\n}\n"
  },
  {
    "path": "AKImageCropperView/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>2.0.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "AKImageCropperView/PrimaryFilledButton.swift",
    "content": "//\n//  PrimaryFilledButton.swift\n//  Visitor\n//\n//  Created by Artem Krachulov on 1/16/17.\n//  Copyright © 2017 VZPass. All rights reserved.\n//\n\nimport Foundation\n"
  },
  {
    "path": "AKImageCropperView.podspec",
    "content": "Pod::Spec.new do |s|\n\n  s.name         = \"AKImageCropperView\"\n  s.version      = \"2.0.0\"\n  s.homepage     = \"https://github.com/artemkrachulov/AKImageCropperView\"\n  s.summary      = \"Responsive image cropper\"\n  s.description  = <<-DESC\n                   Image cropping plugin which supported different devices orientation. Easy to set up and configure. Has many settings for flexible integration into your project. Behavior is similar to native iOS photo cropper.\n                   DESC\n\n  s.license      = { :type => \"MIT\", :file => \"LICENSE\" }\n  s.author       = { \"Artem Krachulov\" => \"artem.krachulov@gmail.com\"  }\n\n  # Source Info\n\n  s.ios.deployment_target = \"8.0\"\n\n  s.source        = { \n    :git => \"https://github.com/artemkrachulov/AKImageCropperView.git\", \n    :tag => 'v'+s.version.to_s \n  }\n\n  s.source_files  = \"AKImageCropperView/*.{swift}\"\n  s.pod_target_xcconfig = { 'SWIFT_VERSION' => '3.0' }\nend"
  },
  {
    "path": "AKImageCropperView.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t011028AB1DFFDD24002AA94E /* AKImageCropperView.h in Headers */ = {isa = PBXBuildFile; fileRef = 011028A91DFFDD24002AA94E /* AKImageCropperView.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t0141AF1D1E052BF6007C5672 /* AKImageCropperScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0141AF1C1E052BF6007C5672 /* AKImageCropperScrollView.swift */; };\n\t\t0155304A1E28F2C500961922 /* IC_UIImageExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 015530491E28F2C500961922 /* IC_UIImageExtensions.swift */; };\n\t\t0155304C1E28FDB800961922 /* IC_CGSizeExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0155304B1E28FDB800961922 /* IC_CGSizeExtensions.swift */; };\n\t\t0155304E1E28FEC600961922 /* IC_CGPointExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0155304D1E28FEC600961922 /* IC_CGPointExtension.swift */; };\n\t\t0166B68F1E03E1560081B751 /* AKImageCropperOverlayViewConfigurationOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0166B68E1E03E1560081B751 /* AKImageCropperOverlayViewConfigurationOverlay.swift */; };\n\t\t016E5EF21DFFDD8300662D31 /* AKImageCropperOverlayViewTouchState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016E5EE71DFFDD8300662D31 /* AKImageCropperOverlayViewTouchState.swift */; };\n\t\t016E5EF31DFFDD8300662D31 /* AKImageCropperOverlayViewConfigurationCorner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016E5EE81DFFDD8300662D31 /* AKImageCropperOverlayViewConfigurationCorner.swift */; };\n\t\t016E5EF41DFFDD8300662D31 /* AKImageCropperOverlayViewConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016E5EE91DFFDD8300662D31 /* AKImageCropperOverlayViewConfiguration.swift */; };\n\t\t016E5EF61DFFDD8300662D31 /* AKImageCropperOverlayViewConfigurationEdge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016E5EEB1DFFDD8300662D31 /* AKImageCropperOverlayViewConfigurationEdge.swift */; };\n\t\t016E5EF71DFFDD8300662D31 /* AKImageCropperOverlayViewConfigurationGrid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016E5EEC1DFFDD8300662D31 /* AKImageCropperOverlayViewConfigurationGrid.swift */; };\n\t\t016E5EF81DFFDD8300662D31 /* AKImageCropperOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016E5EED1DFFDD8300662D31 /* AKImageCropperOverlayView.swift */; };\n\t\t016E5EFB1DFFDD8300662D31 /* AKImageCropperView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016E5EF01DFFDD8300662D31 /* AKImageCropperView.swift */; };\n\t\t016E5EFE1DFFE77400662D31 /* AKImageCropperView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 011028A71DFFDD24002AA94E /* AKImageCropperView.framework */; };\n\t\t016E5EFF1DFFE77400662D31 /* AKImageCropperView.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 011028A71DFFDD24002AA94E /* AKImageCropperView.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t01C48FBC1DEC250100FBBE34 /* CustomImageCropperOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01C48FBB1DEC250100FBBE34 /* CustomImageCropperOverlayView.swift */; };\n\t\t01F61BE51E4DC7B800977E33 /* IC_CGFloatExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F61BE41E4DC7B800977E33 /* IC_CGFloatExtension.swift */; };\n\t\t01FA13EF1DDF0C6E006B8C3A /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01FA13EE1DDF0C6E006B8C3A /* Constants.swift */; };\n\t\t4356D6141B8F3DE90033FDBD /* ImageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4356D6131B8F3DE90033FDBD /* ImageViewController.swift */; };\n\t\t43CBB4031B870EBC00C8F9AE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CBB4021B870EBC00C8F9AE /* AppDelegate.swift */; };\n\t\t43CBB4051B870EBC00C8F9AE /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CBB4041B870EBC00C8F9AE /* HomeViewController.swift */; };\n\t\t43CBB4081B870EBC00C8F9AE /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 43CBB4061B870EBC00C8F9AE /* Main.storyboard */; };\n\t\t43CBB40A1B870EBC00C8F9AE /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 43CBB4091B870EBC00C8F9AE /* Images.xcassets */; };\n\t\t43CBB40D1B870EBC00C8F9AE /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 43CBB40B1B870EBC00C8F9AE /* LaunchScreen.xib */; };\n\t\t43CBB4241B8716EA00C8F9AE /* CropperViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CBB4231B8716EA00C8F9AE /* CropperViewController.swift */; };\n\t\t43CBB4401B8739B100C8F9AE /* ImagesTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43CBB43F1B8739B100C8F9AE /* ImagesTableViewController.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t016E5F001DFFE77400662D31 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 43CBB3F51B870EBC00C8F9AE /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 011028A61DFFDD24002AA94E;\n\t\t\tremoteInfo = AKImageCropperView;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t016E5F021DFFE77400662D31 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t016E5EFF1DFFE77400662D31 /* AKImageCropperView.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t011028A71DFFDD24002AA94E /* AKImageCropperView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AKImageCropperView.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t011028A91DFFDD24002AA94E /* AKImageCropperView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AKImageCropperView.h; sourceTree = \"<group>\"; };\n\t\t011028AA1DFFDD24002AA94E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t0141AF1C1E052BF6007C5672 /* AKImageCropperScrollView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AKImageCropperScrollView.swift; sourceTree = \"<group>\"; };\n\t\t015530491E28F2C500961922 /* IC_UIImageExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IC_UIImageExtensions.swift; sourceTree = \"<group>\"; };\n\t\t0155304B1E28FDB800961922 /* IC_CGSizeExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IC_CGSizeExtensions.swift; sourceTree = \"<group>\"; };\n\t\t0155304D1E28FEC600961922 /* IC_CGPointExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IC_CGPointExtension.swift; sourceTree = \"<group>\"; };\n\t\t0166B68E1E03E1560081B751 /* AKImageCropperOverlayViewConfigurationOverlay.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AKImageCropperOverlayViewConfigurationOverlay.swift; sourceTree = \"<group>\"; };\n\t\t016E5EE71DFFDD8300662D31 /* AKImageCropperOverlayViewTouchState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AKImageCropperOverlayViewTouchState.swift; sourceTree = \"<group>\"; };\n\t\t016E5EE81DFFDD8300662D31 /* AKImageCropperOverlayViewConfigurationCorner.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AKImageCropperOverlayViewConfigurationCorner.swift; sourceTree = \"<group>\"; };\n\t\t016E5EE91DFFDD8300662D31 /* AKImageCropperOverlayViewConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AKImageCropperOverlayViewConfiguration.swift; sourceTree = \"<group>\"; };\n\t\t016E5EEB1DFFDD8300662D31 /* AKImageCropperOverlayViewConfigurationEdge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AKImageCropperOverlayViewConfigurationEdge.swift; sourceTree = \"<group>\"; };\n\t\t016E5EEC1DFFDD8300662D31 /* AKImageCropperOverlayViewConfigurationGrid.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AKImageCropperOverlayViewConfigurationGrid.swift; sourceTree = \"<group>\"; };\n\t\t016E5EED1DFFDD8300662D31 /* AKImageCropperOverlayView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AKImageCropperOverlayView.swift; sourceTree = \"<group>\"; };\n\t\t016E5EF01DFFDD8300662D31 /* AKImageCropperView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AKImageCropperView.swift; sourceTree = \"<group>\"; };\n\t\t01C48FBB1DEC250100FBBE34 /* CustomImageCropperOverlayView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomImageCropperOverlayView.swift; sourceTree = \"<group>\"; };\n\t\t01F61BE41E4DC7B800977E33 /* IC_CGFloatExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IC_CGFloatExtension.swift; sourceTree = \"<group>\"; };\n\t\t01FA13EE1DDF0C6E006B8C3A /* Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = \"<group>\"; };\n\t\t4356D6131B8F3DE90033FDBD /* ImageViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageViewController.swift; sourceTree = \"<group>\"; };\n\t\t43CBB3FD1B870EBC00C8F9AE /* AKImageCropperViewExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AKImageCropperViewExample.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t43CBB4011B870EBC00C8F9AE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t43CBB4021B870EBC00C8F9AE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t43CBB4041B870EBC00C8F9AE /* HomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = \"<group>\"; };\n\t\t43CBB4071B870EBC00C8F9AE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t43CBB4091B870EBC00C8F9AE /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\t43CBB40C1B870EBC00C8F9AE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = \"<group>\"; };\n\t\t43CBB4231B8716EA00C8F9AE /* CropperViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CropperViewController.swift; sourceTree = \"<group>\"; };\n\t\t43CBB43F1B8739B100C8F9AE /* ImagesTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImagesTableViewController.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t011028A31DFFDD24002AA94E /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t43CBB3FA1B870EBC00C8F9AE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t016E5EFE1DFFE77400662D31 /* AKImageCropperView.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t011028A81DFFDD24002AA94E /* AKImageCropperView */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t011028A91DFFDD24002AA94E /* AKImageCropperView.h */,\n\t\t\t\t011028AA1DFFDD24002AA94E /* Info.plist */,\n\t\t\t\t016E5EF01DFFDD8300662D31 /* AKImageCropperView.swift */,\n\t\t\t\t0141AF1C1E052BF6007C5672 /* AKImageCropperScrollView.swift */,\n\t\t\t\t016E5EED1DFFDD8300662D31 /* AKImageCropperOverlayView.swift */,\n\t\t\t\t016E5EE71DFFDD8300662D31 /* AKImageCropperOverlayViewTouchState.swift */,\n\t\t\t\t01F61BE61E4DC89300977E33 /* configuration */,\n\t\t\t\t015530461E28EF5A00961922 /* extensions */,\n\t\t\t);\n\t\t\tpath = AKImageCropperView;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t015530461E28EF5A00961922 /* extensions */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t015530491E28F2C500961922 /* IC_UIImageExtensions.swift */,\n\t\t\t\t0155304B1E28FDB800961922 /* IC_CGSizeExtensions.swift */,\n\t\t\t\t0155304D1E28FEC600961922 /* IC_CGPointExtension.swift */,\n\t\t\t\t01F61BE41E4DC7B800977E33 /* IC_CGFloatExtension.swift */,\n\t\t\t);\n\t\t\tname = extensions;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t01F61BE61E4DC89300977E33 /* configuration */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t016E5EE91DFFDD8300662D31 /* AKImageCropperOverlayViewConfiguration.swift */,\n\t\t\t\t0166B68E1E03E1560081B751 /* AKImageCropperOverlayViewConfigurationOverlay.swift */,\n\t\t\t\t016E5EEB1DFFDD8300662D31 /* AKImageCropperOverlayViewConfigurationEdge.swift */,\n\t\t\t\t016E5EE81DFFDD8300662D31 /* AKImageCropperOverlayViewConfigurationCorner.swift */,\n\t\t\t\t016E5EEC1DFFDD8300662D31 /* AKImageCropperOverlayViewConfigurationGrid.swift */,\n\t\t\t);\n\t\t\tname = configuration;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43CBB3F41B870EBC00C8F9AE = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t011028A81DFFDD24002AA94E /* AKImageCropperView */,\n\t\t\t\t43CBB3FF1B870EBC00C8F9AE /* AKImageCropperViewExample */,\n\t\t\t\t43CBB3FE1B870EBC00C8F9AE /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43CBB3FE1B870EBC00C8F9AE /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43CBB3FD1B870EBC00C8F9AE /* AKImageCropperViewExample.app */,\n\t\t\t\t011028A71DFFDD24002AA94E /* AKImageCropperView.framework */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43CBB3FF1B870EBC00C8F9AE /* AKImageCropperViewExample */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43CBB4011B870EBC00C8F9AE /* Info.plist */,\n\t\t\t\t43CBB4021B870EBC00C8F9AE /* AppDelegate.swift */,\n\t\t\t\t01FA13EE1DDF0C6E006B8C3A /* Constants.swift */,\n\t\t\t\t43CBB4091B870EBC00C8F9AE /* Images.xcassets */,\n\t\t\t\t43CBB40B1B870EBC00C8F9AE /* LaunchScreen.xib */,\n\t\t\t\t43CBB4061B870EBC00C8F9AE /* Main.storyboard */,\n\t\t\t\t43CBB4041B870EBC00C8F9AE /* HomeViewController.swift */,\n\t\t\t\t43CBB43F1B8739B100C8F9AE /* ImagesTableViewController.swift */,\n\t\t\t\t43CBB4231B8716EA00C8F9AE /* CropperViewController.swift */,\n\t\t\t\t4356D6131B8F3DE90033FDBD /* ImageViewController.swift */,\n\t\t\t\t01C48FBB1DEC250100FBBE34 /* CustomImageCropperOverlayView.swift */,\n\t\t\t);\n\t\t\tpath = AKImageCropperViewExample;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t011028A41DFFDD24002AA94E /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t011028AB1DFFDD24002AA94E /* AKImageCropperView.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t011028A61DFFDD24002AA94E /* AKImageCropperView */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 011028B01DFFDD24002AA94E /* Build configuration list for PBXNativeTarget \"AKImageCropperView\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t011028A21DFFDD24002AA94E /* Sources */,\n\t\t\t\t011028A31DFFDD24002AA94E /* Frameworks */,\n\t\t\t\t011028A41DFFDD24002AA94E /* Headers */,\n\t\t\t\t011028A51DFFDD24002AA94E /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = AKImageCropperView;\n\t\t\tproductName = AKImageCropperView;\n\t\t\tproductReference = 011028A71DFFDD24002AA94E /* AKImageCropperView.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t43CBB3FC1B870EBC00C8F9AE /* AKImageCropperViewExample */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 43CBB41C1B870EBC00C8F9AE /* Build configuration list for PBXNativeTarget \"AKImageCropperViewExample\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t43CBB3F91B870EBC00C8F9AE /* Sources */,\n\t\t\t\t43CBB3FA1B870EBC00C8F9AE /* Frameworks */,\n\t\t\t\t43CBB3FB1B870EBC00C8F9AE /* Resources */,\n\t\t\t\t016E5F021DFFE77400662D31 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t016E5F011DFFE77400662D31 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = AKImageCropperViewExample;\n\t\t\tproductName = AKImageCropperDemo;\n\t\t\tproductReference = 43CBB3FD1B870EBC00C8F9AE /* AKImageCropperViewExample.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t43CBB3F51B870EBC00C8F9AE /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftMigration = 0700;\n\t\t\t\tLastSwiftUpdateCheck = 0700;\n\t\t\t\tLastUpgradeCheck = 0820;\n\t\t\t\tORGANIZATIONNAME = \"Artem Krachulov\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t011028A61DFFDD24002AA94E = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.1;\n\t\t\t\t\t\tLastSwiftMigration = 0810;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t\t43CBB3FC1B870EBC00C8F9AE = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.4;\n\t\t\t\t\t\tDevelopmentTeam = 5JV4U8LEZ8;\n\t\t\t\t\t\tLastSwiftMigration = 0810;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 43CBB3F81B870EBC00C8F9AE /* Build configuration list for PBXProject \"AKImageCropperView\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 43CBB3F41B870EBC00C8F9AE;\n\t\t\tproductRefGroup = 43CBB3FE1B870EBC00C8F9AE /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t011028A61DFFDD24002AA94E /* AKImageCropperView */,\n\t\t\t\t43CBB3FC1B870EBC00C8F9AE /* AKImageCropperViewExample */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t011028A51DFFDD24002AA94E /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t43CBB3FB1B870EBC00C8F9AE /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t43CBB4081B870EBC00C8F9AE /* Main.storyboard in Resources */,\n\t\t\t\t43CBB40D1B870EBC00C8F9AE /* LaunchScreen.xib in Resources */,\n\t\t\t\t43CBB40A1B870EBC00C8F9AE /* Images.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t011028A21DFFDD24002AA94E /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t016E5EF41DFFDD8300662D31 /* AKImageCropperOverlayViewConfiguration.swift in Sources */,\n\t\t\t\t0166B68F1E03E1560081B751 /* AKImageCropperOverlayViewConfigurationOverlay.swift in Sources */,\n\t\t\t\t0155304C1E28FDB800961922 /* IC_CGSizeExtensions.swift in Sources */,\n\t\t\t\t016E5EF81DFFDD8300662D31 /* AKImageCropperOverlayView.swift in Sources */,\n\t\t\t\t0155304A1E28F2C500961922 /* IC_UIImageExtensions.swift in Sources */,\n\t\t\t\t016E5EFB1DFFDD8300662D31 /* AKImageCropperView.swift in Sources */,\n\t\t\t\t016E5EF31DFFDD8300662D31 /* AKImageCropperOverlayViewConfigurationCorner.swift in Sources */,\n\t\t\t\t01F61BE51E4DC7B800977E33 /* IC_CGFloatExtension.swift in Sources */,\n\t\t\t\t0155304E1E28FEC600961922 /* IC_CGPointExtension.swift in Sources */,\n\t\t\t\t016E5EF21DFFDD8300662D31 /* AKImageCropperOverlayViewTouchState.swift in Sources */,\n\t\t\t\t0141AF1D1E052BF6007C5672 /* AKImageCropperScrollView.swift in Sources */,\n\t\t\t\t016E5EF71DFFDD8300662D31 /* AKImageCropperOverlayViewConfigurationGrid.swift in Sources */,\n\t\t\t\t016E5EF61DFFDD8300662D31 /* AKImageCropperOverlayViewConfigurationEdge.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t43CBB3F91B870EBC00C8F9AE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t43CBB4051B870EBC00C8F9AE /* HomeViewController.swift in Sources */,\n\t\t\t\t01C48FBC1DEC250100FBBE34 /* CustomImageCropperOverlayView.swift in Sources */,\n\t\t\t\t43CBB4241B8716EA00C8F9AE /* CropperViewController.swift in Sources */,\n\t\t\t\t01FA13EF1DDF0C6E006B8C3A /* Constants.swift in Sources */,\n\t\t\t\t43CBB4031B870EBC00C8F9AE /* AppDelegate.swift in Sources */,\n\t\t\t\t4356D6141B8F3DE90033FDBD /* ImageViewController.swift in Sources */,\n\t\t\t\t43CBB4401B8739B100C8F9AE /* ImagesTableViewController.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t016E5F011DFFE77400662D31 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 011028A61DFFDD24002AA94E /* AKImageCropperView */;\n\t\t\ttargetProxy = 016E5F001DFFE77400662D31 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t43CBB4061B870EBC00C8F9AE /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t43CBB4071B870EBC00C8F9AE /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43CBB40B1B870EBC00C8F9AE /* LaunchScreen.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t43CBB40C1B870EBC00C8F9AE /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t011028B11DFFDD24002AA94E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = AKImageCropperView/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.artemkrachulov.AKImageCropperView;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t011028B21DFFDD24002AA94E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = AKImageCropperView/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.artemkrachulov.AKImageCropperView;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t43CBB41A1B870EBC00C8F9AE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t43CBB41B1B870EBC00C8F9AE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t43CBB41D1B870EBC00C8F9AE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tDEVELOPMENT_TEAM = 5JV4U8LEZ8;\n\t\t\t\tINFOPLIST_FILE = AKImageCropperViewExample/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_SWIFT_FLAGS = \"-D AKImageCropperViewDEBUG\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = artem.krachulov.AKImageCropper;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t43CBB41E1B870EBC00C8F9AE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tDEVELOPMENT_TEAM = 5JV4U8LEZ8;\n\t\t\t\tINFOPLIST_FILE = AKImageCropperViewExample/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = No;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = artem.krachulov.AKImageCropper;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t011028B01DFFDD24002AA94E /* Build configuration list for PBXNativeTarget \"AKImageCropperView\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t011028B11DFFDD24002AA94E /* Debug */,\n\t\t\t\t011028B21DFFDD24002AA94E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t43CBB3F81B870EBC00C8F9AE /* Build configuration list for PBXProject \"AKImageCropperView\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t43CBB41A1B870EBC00C8F9AE /* Debug */,\n\t\t\t\t43CBB41B1B870EBC00C8F9AE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t43CBB41C1B870EBC00C8F9AE /* Build configuration list for PBXNativeTarget \"AKImageCropperViewExample\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t43CBB41D1B870EBC00C8F9AE /* Debug */,\n\t\t\t\t43CBB41E1B870EBC00C8F9AE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 43CBB3F51B870EBC00C8F9AE /* Project object */;\n}\n"
  },
  {
    "path": "AKImageCropperView.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:/Users/artemkrachulov/Repos/AKImageCropper/AKImageCropperView.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "AKImageCropperView.xcodeproj/project.xcworkspace/xcshareddata/AKImageCropperDemo.xcscmblueprint",
    "content": "{\n  \"DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey\" : \"74FC6B16832EDE035AC047E84A01E2F0C9097FE9\",\n  \"DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey\" : {\n\n  },\n  \"DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey\" : {\n    \"74FC6B16832EDE035AC047E84A01E2F0C9097FE9\" : 0,\n    \"F0D98E582FA112BC083159DA5B51E17128CD38B4\" : 0,\n    \"B234E04AE2BC64FD278418F0B83A3F07C2F904DB\" : 0,\n    \"78558585540D6A03C4B47C1A04640D7B2BD34C66\" : 0,\n    \"EAD4BE7C3980137405ECAE8A71597A264DEE9FD1\" : 0\n  },\n  \"DVTSourceControlWorkspaceBlueprintIdentifierKey\" : \"CACF0744-A1D3-4BA8-8481-EB16E6A7A6C0\",\n  \"DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey\" : {\n    \"74FC6B16832EDE035AC047E84A01E2F0C9097FE9\" : \"AKImageCropper\\/\",\n    \"F0D98E582FA112BC083159DA5B51E17128CD38B4\" : \"AKImageCropper\\/Demo\\/Vendor\\/Extensions\\/Double-Float\\/\",\n    \"B234E04AE2BC64FD278418F0B83A3F07C2F904DB\" : \"AKImageCropper\\/Demo\\/Vendor\\/Extensions\\/CGRect-CGSize\\/\",\n    \"78558585540D6A03C4B47C1A04640D7B2BD34C66\" : \"AKImageCropper\\/Demo\\/Vendor\\/Extensions\\/Range\\/\",\n    \"EAD4BE7C3980137405ECAE8A71597A264DEE9FD1\" : \"AKImageCropper\\/Demo\\/Vendor\\/Extensions\\/UIImage\\/\"\n  },\n  \"DVTSourceControlWorkspaceBlueprintNameKey\" : \"AKImageCropperDemo\",\n  \"DVTSourceControlWorkspaceBlueprintVersion\" : 204,\n  \"DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey\" : \"Demo\\/AKImageCropperDemo.xcodeproj\",\n  \"DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey\" : [\n    {\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey\" : \"github.com:artemkrachulov\\/AKImageCropper.git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey\" : \"com.apple.dt.Xcode.sourcecontrol.Git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey\" : \"74FC6B16832EDE035AC047E84A01E2F0C9097FE9\"\n    },\n    {\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey\" : \"https:\\/\\/github.com\\/artemkrachulov\\/Range-Extension.git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey\" : \"com.apple.dt.Xcode.sourcecontrol.Git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey\" : \"78558585540D6A03C4B47C1A04640D7B2BD34C66\"\n    },\n    {\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey\" : \"https:\\/\\/github.com\\/artemkrachulov\\/CGRect-CGSize-Extensions.git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey\" : \"com.apple.dt.Xcode.sourcecontrol.Git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey\" : \"B234E04AE2BC64FD278418F0B83A3F07C2F904DB\"\n    },\n    {\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey\" : \"https:\\/\\/github.com\\/artemkrachulov\\/UIImage-Extension.git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey\" : \"com.apple.dt.Xcode.sourcecontrol.Git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey\" : \"EAD4BE7C3980137405ECAE8A71597A264DEE9FD1\"\n    },\n    {\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey\" : \"https:\\/\\/github.com\\/artemkrachulov\\/Double-Float-Extensions.git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey\" : \"com.apple.dt.Xcode.sourcecontrol.Git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey\" : \"F0D98E582FA112BC083159DA5B51E17128CD38B4\"\n    }\n  ]\n}"
  },
  {
    "path": "AKImageCropperView.xcodeproj/project.xcworkspace/xcshareddata/Demo.xcscmblueprint",
    "content": "{\n  \"DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey\" : \"74FC6B16832EDE035AC047E84A01E2F0C9097FE9\",\n  \"DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey\" : {\n\n  },\n  \"DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey\" : {\n    \"74FC6B16832EDE035AC047E84A01E2F0C9097FE9\" : 0,\n    \"F0D98E582FA112BC083159DA5B51E17128CD38B4\" : 0,\n    \"B234E04AE2BC64FD278418F0B83A3F07C2F904DB\" : 0,\n    \"78558585540D6A03C4B47C1A04640D7B2BD34C66\" : 0,\n    \"EAD4BE7C3980137405ECAE8A71597A264DEE9FD1\" : 0\n  },\n  \"DVTSourceControlWorkspaceBlueprintIdentifierKey\" : \"349E57B7-4D5D-430B-958A-5768311D2060\",\n  \"DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey\" : {\n    \"74FC6B16832EDE035AC047E84A01E2F0C9097FE9\" : \"AKImageCropper\\/\",\n    \"F0D98E582FA112BC083159DA5B51E17128CD38B4\" : \"AKImageCropper\\/Demo\\/Vendor\\/Extensions\\/Double-Float\\/\",\n    \"B234E04AE2BC64FD278418F0B83A3F07C2F904DB\" : \"AKImageCropper\\/Demo\\/Vendor\\/Extensions\\/CGRect-CGSize\\/\",\n    \"78558585540D6A03C4B47C1A04640D7B2BD34C66\" : \"AKImageCropper\\/Demo\\/Vendor\\/Extensions\\/Range\\/\",\n    \"EAD4BE7C3980137405ECAE8A71597A264DEE9FD1\" : \"AKImageCropper\\/Demo\\/Vendor\\/Extensions\\/UIImage\\/\"\n  },\n  \"DVTSourceControlWorkspaceBlueprintNameKey\" : \"Demo\",\n  \"DVTSourceControlWorkspaceBlueprintVersion\" : 204,\n  \"DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey\" : \"Demo\\/Demo.xcodeproj\",\n  \"DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey\" : [\n    {\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey\" : \"github.com:artemkrachulov\\/AKImageCropper.git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey\" : \"com.apple.dt.Xcode.sourcecontrol.Git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey\" : \"74FC6B16832EDE035AC047E84A01E2F0C9097FE9\"\n    },\n    {\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey\" : \"https:\\/\\/github.com\\/artemkrachulov\\/Range-Extension.git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey\" : \"com.apple.dt.Xcode.sourcecontrol.Git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey\" : \"78558585540D6A03C4B47C1A04640D7B2BD34C66\"\n    },\n    {\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey\" : \"https:\\/\\/github.com\\/artemkrachulov\\/CGRect-CGSize-Extensions.git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey\" : \"com.apple.dt.Xcode.sourcecontrol.Git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey\" : \"B234E04AE2BC64FD278418F0B83A3F07C2F904DB\"\n    },\n    {\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey\" : \"https:\\/\\/github.com\\/artemkrachulov\\/UIImage-Extension.git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey\" : \"com.apple.dt.Xcode.sourcecontrol.Git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey\" : \"EAD4BE7C3980137405ECAE8A71597A264DEE9FD1\"\n    },\n    {\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey\" : \"https:\\/\\/github.com\\/artemkrachulov\\/Double-Float-Extensions.git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey\" : \"com.apple.dt.Xcode.sourcecontrol.Git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey\" : \"F0D98E582FA112BC083159DA5B51E17128CD38B4\"\n    }\n  ]\n}"
  },
  {
    "path": "AKImageCropperView.xcodeproj/xcshareddata/xcschemes/AKImageCropperView.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0820\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"011028A61DFFDD24002AA94E\"\n               BuildableName = \"AKImageCropperView.framework\"\n               BlueprintName = \"AKImageCropperView\"\n               ReferencedContainer = \"container:AKImageCropperView.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"011028A61DFFDD24002AA94E\"\n            BuildableName = \"AKImageCropperView.framework\"\n            BlueprintName = \"AKImageCropperView\"\n            ReferencedContainer = \"container:AKImageCropperView.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"011028A61DFFDD24002AA94E\"\n            BuildableName = \"AKImageCropperView.framework\"\n            BlueprintName = \"AKImageCropperView\"\n            ReferencedContainer = \"container:AKImageCropperView.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "AKImageCropperViewExample/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  AKImageCropperDemo\n//  GitHub: https://github.com/artemkrachulov/AKImageCropper\n//\n//  Created by Krachulov Artem\n//  Copyright (c) 2015 Krachulov Artem. All rights reserved.\n//  Website: http://www.artemkrachulov.com/\n//\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {\n        // Override point for customization after application launch.\n        return true\n    }\n\n    func applicationWillResignActive(_ application: UIApplication) {\n        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.\n        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.\n    }\n\n    func applicationDidEnterBackground(_ application: UIApplication) {\n        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.\n        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.\n    }\n\n    func applicationWillEnterForeground(_ application: UIApplication) {\n        // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.\n    }\n\n    func applicationDidBecomeActive(_ application: UIApplication) {\n        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.\n    }\n\n    func applicationWillTerminate(_ application: UIApplication) {\n        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.\n    }\n}\n\n"
  },
  {
    "path": "AKImageCropperViewExample/Base.lproj/LaunchScreen.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"11542\" systemVersion=\"16B2555\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina4_7\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11524\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"OND-g9-1i5\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <simulatedStatusBarMetrics key=\"simulatedStatusBarMetrics\"/>\n            <point key=\"canvasLocation\" x=\"589\" y=\"579\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "AKImageCropperViewExample/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"11762\" systemVersion=\"16D32\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"wQk-zT-bng\">\n    <device id=\"retina4_7\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11757\"/>\n        <capability name=\"Constraints to layout margins\" minToolsVersion=\"6.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Demo folder-->\n        <scene sceneID=\"R06-je-7kK\">\n            <objects>\n                <tableViewController id=\"dCy-DU-1gs\" customClass=\"ImagesTableViewController\" customModule=\"AKImageCropperViewExample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"grouped\" separatorStyle=\"default\" rowHeight=\"80\" sectionHeaderHeight=\"10\" sectionFooterHeight=\"10\" id=\"8Qw-gW-rSq\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"0.93725490196078431\" green=\"0.93725490196078431\" blue=\"0.95686274509803926\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <prototypes>\n                            <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"default\" accessoryType=\"disclosureIndicator\" indentationWidth=\"10\" reuseIdentifier=\"image\" textLabel=\"PAT-oO-2hL\" detailTextLabel=\"mnx-Mm-eqW\" style=\"IBUITableViewCellStyleSubtitle\" id=\"uS4-ET-v3L\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"56\" width=\"375\" height=\"80\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"uS4-ET-v3L\" id=\"pRa-pE-0iP\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"342\" height=\"79\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                    <subviews>\n                                        <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"Title\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"PAT-oO-2hL\">\n                                            <rect key=\"frame\" x=\"15\" y=\"20\" width=\"34\" height=\"21\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                            <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                        <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"Detail\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"mnx-Mm-eqW\">\n                                            <rect key=\"frame\" x=\"15\" y=\"41\" width=\"40\" height=\"18\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"15\"/>\n                                            <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                    </subviews>\n                                </tableViewCellContentView>\n                                <connections>\n                                    <segue destination=\"Rdn-7Y-KLl\" kind=\"show\" id=\"awS-AO-qOC\"/>\n                                </connections>\n                            </tableViewCell>\n                        </prototypes>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"dCy-DU-1gs\" id=\"AGP-R5-LfS\"/>\n                            <outlet property=\"delegate\" destination=\"dCy-DU-1gs\" id=\"Nx1-yp-dHE\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Demo folder\" id=\"7Is-JM-HRz\"/>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"7Ef-Cy-a8G\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1220\" y=\"618\"/>\n        </scene>\n        <!--Crop View-->\n        <scene sceneID=\"knG-at-evs\">\n            <objects>\n                <viewController storyboardIdentifier=\"cropperViewController\" automaticallyAdjustsScrollViewInsets=\"NO\" id=\"Rdn-7Y-KLl\" customClass=\"CropperViewController\" customModule=\"AKImageCropperViewExample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Qt6-f6-NMs\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"aDG-WU-S8J\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"yhB-g2-lKN\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"NNR-8r-Iig\" customClass=\"AKImageCropperView\" customModule=\"AKImageCropperView\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"20\" width=\"375\" height=\"607\"/>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"0.10000000000000001\" colorSpace=\"calibratedWhite\"/>\n                            </view>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"yeD-f2-GC0\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"577\" width=\"375\" height=\"50\"/>\n                                <subviews>\n                                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"OcE-Cr-oaV\">\n                                        <rect key=\"frame\" x=\"8\" y=\"14\" width=\"22\" height=\"22\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"22\" id=\"0kW-xk-M2d\"/>\n                                            <constraint firstAttribute=\"width\" constant=\"22\" id=\"nt9-AI-Qkr\"/>\n                                        </constraints>\n                                        <color key=\"tintColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <state key=\"normal\" image=\"rotate\"/>\n                                        <connections>\n                                            <action selector=\"rotateAction:\" destination=\"Rdn-7Y-KLl\" eventType=\"touchUpInside\" id=\"uFB-UV-6jK\"/>\n                                        </connections>\n                                    </button>\n                                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"aDm-Fl-m9C\">\n                                        <rect key=\"frame\" x=\"164.5\" y=\"10\" width=\"46\" height=\"30\"/>\n                                        <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                                        <color key=\"tintColor\" red=\"1\" green=\"0.40000000600000002\" blue=\"0.40000000600000002\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                        <state key=\"normal\" title=\"RESET\"/>\n                                        <connections>\n                                            <action selector=\"resetAction:\" destination=\"Rdn-7Y-KLl\" eventType=\"touchUpInside\" id=\"iyC-RF-aoB\"/>\n                                        </connections>\n                                    </button>\n                                </subviews>\n                                <color key=\"backgroundColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"50\" id=\"1uM-rd-DUd\"/>\n                                    <constraint firstItem=\"OcE-Cr-oaV\" firstAttribute=\"centerY\" secondItem=\"yeD-f2-GC0\" secondAttribute=\"centerY\" id=\"227-80-ud3\"/>\n                                    <constraint firstItem=\"OcE-Cr-oaV\" firstAttribute=\"leading\" secondItem=\"yeD-f2-GC0\" secondAttribute=\"leading\" constant=\"8\" id=\"Yxu-MS-NnN\"/>\n                                    <constraint firstItem=\"aDm-Fl-m9C\" firstAttribute=\"centerX\" secondItem=\"yeD-f2-GC0\" secondAttribute=\"centerX\" id=\"lrf-sz-2JO\"/>\n                                    <constraint firstItem=\"aDm-Fl-m9C\" firstAttribute=\"centerY\" secondItem=\"yeD-f2-GC0\" secondAttribute=\"centerY\" id=\"saC-mg-X6V\"/>\n                                </constraints>\n                            </view>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"wMD-3V-hUT\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"627\" width=\"375\" height=\"40\"/>\n                                <subviews>\n                                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Xik-3z-UDc\">\n                                        <rect key=\"frame\" x=\"8\" y=\"4\" width=\"38\" height=\"33\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                        <color key=\"tintColor\" red=\"0.0\" green=\"0.50196081400000003\" blue=\"1\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                        <state key=\"normal\" title=\"Back\">\n                                            <color key=\"titleShadowColor\" red=\"0.5\" green=\"0.5\" blue=\"0.5\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        </state>\n                                        <connections>\n                                            <action selector=\"backAction:\" destination=\"Rdn-7Y-KLl\" eventType=\"touchUpInside\" id=\"Wkj-3h-8yo\"/>\n                                        </connections>\n                                    </button>\n                                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"AAk-pb-8ob\">\n                                        <rect key=\"frame\" x=\"329\" y=\"4\" width=\"38\" height=\"33\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                        <color key=\"tintColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <state key=\"normal\" title=\"Crop\">\n                                            <color key=\"titleColor\" red=\"1\" green=\"1\" blue=\"0.40000000600000002\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                            <color key=\"titleShadowColor\" red=\"0.5\" green=\"0.5\" blue=\"0.5\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        </state>\n                                        <connections>\n                                            <action selector=\"cropImageAction:\" destination=\"Rdn-7Y-KLl\" eventType=\"touchUpInside\" id=\"h04-VG-mda\"/>\n                                        </connections>\n                                    </button>\n                                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"vLm-vA-Gov\">\n                                        <rect key=\"frame\" x=\"176.5\" y=\"9\" width=\"22\" height=\"22\"/>\n                                        <color key=\"tintColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <state key=\"normal\" image=\"overlay\"/>\n                                        <connections>\n                                            <action selector=\"showHideOverlayAction:\" destination=\"Rdn-7Y-KLl\" eventType=\"touchUpInside\" id=\"tff-m1-bAb\"/>\n                                        </connections>\n                                    </button>\n                                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qcw-Wp-RWG\">\n                                        <rect key=\"frame\" x=\"254\" y=\"3\" width=\"67\" height=\"34\"/>\n                                        <color key=\"tintColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <state key=\"normal\" title=\"Random\"/>\n                                        <connections>\n                                            <action selector=\"randomImageAction:\" destination=\"Rdn-7Y-KLl\" eventType=\"touchUpInside\" id=\"XVg-Cw-aoJ\"/>\n                                        </connections>\n                                    </button>\n                                </subviews>\n                                <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"0.10000000000000001\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <constraints>\n                                    <constraint firstItem=\"Xik-3z-UDc\" firstAttribute=\"leading\" secondItem=\"wMD-3V-hUT\" secondAttribute=\"leading\" constant=\"8\" id=\"6rD-QV-lr8\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"AAk-pb-8ob\" secondAttribute=\"trailing\" constant=\"8\" id=\"9ig-1u-DSl\"/>\n                                    <constraint firstItem=\"vLm-vA-Gov\" firstAttribute=\"centerX\" secondItem=\"wMD-3V-hUT\" secondAttribute=\"centerX\" id=\"MEl-vD-dqU\"/>\n                                    <constraint firstItem=\"vLm-vA-Gov\" firstAttribute=\"centerY\" secondItem=\"wMD-3V-hUT\" secondAttribute=\"centerY\" id=\"cSm-Zo-lKa\"/>\n                                    <constraint firstItem=\"qcw-Wp-RWG\" firstAttribute=\"centerY\" secondItem=\"AAk-pb-8ob\" secondAttribute=\"centerY\" id=\"cpp-Ph-nL5\"/>\n                                    <constraint firstItem=\"AAk-pb-8ob\" firstAttribute=\"leading\" secondItem=\"qcw-Wp-RWG\" secondAttribute=\"trailing\" constant=\"8\" id=\"k4D-Pz-J3X\"/>\n                                    <constraint firstItem=\"AAk-pb-8ob\" firstAttribute=\"centerY\" secondItem=\"wMD-3V-hUT\" secondAttribute=\"centerY\" id=\"lp9-6a-Wrt\"/>\n                                    <constraint firstItem=\"Xik-3z-UDc\" firstAttribute=\"centerY\" secondItem=\"wMD-3V-hUT\" secondAttribute=\"centerY\" id=\"qtX-gn-NoI\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"40\" id=\"rSL-W9-EEC\"/>\n                                </constraints>\n                            </view>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"NNR-8r-Iig\" secondAttribute=\"trailing\" id=\"4m8-EW-rOa\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"wMD-3V-hUT\" secondAttribute=\"trailing\" id=\"5mI-PE-xbj\"/>\n                            <constraint firstItem=\"yeD-f2-GC0\" firstAttribute=\"leading\" secondItem=\"yhB-g2-lKN\" secondAttribute=\"leading\" id=\"IqO-nt-y3G\"/>\n                            <constraint firstItem=\"wMD-3V-hUT\" firstAttribute=\"leading\" secondItem=\"yhB-g2-lKN\" secondAttribute=\"leading\" id=\"PZz-n2-ppW\"/>\n                            <constraint firstItem=\"wMD-3V-hUT\" firstAttribute=\"top\" secondItem=\"NNR-8r-Iig\" secondAttribute=\"bottom\" id=\"SAb-zF-ExQ\"/>\n                            <constraint firstItem=\"NNR-8r-Iig\" firstAttribute=\"top\" secondItem=\"Qt6-f6-NMs\" secondAttribute=\"bottom\" id=\"XIq-wp-GCF\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"yeD-f2-GC0\" secondAttribute=\"trailing\" id=\"bQg-Xe-T56\"/>\n                            <constraint firstItem=\"aDG-WU-S8J\" firstAttribute=\"top\" secondItem=\"wMD-3V-hUT\" secondAttribute=\"bottom\" id=\"hZW-cD-Y7S\"/>\n                            <constraint firstAttribute=\"leading\" secondItem=\"NNR-8r-Iig\" secondAttribute=\"leading\" id=\"jbS-cc-pHL\"/>\n                            <constraint firstItem=\"wMD-3V-hUT\" firstAttribute=\"top\" secondItem=\"yeD-f2-GC0\" secondAttribute=\"bottom\" id=\"zDw-ek-9hi\"/>\n                        </constraints>\n                    </view>\n                    <navigationItem key=\"navigationItem\" title=\"Crop View\" id=\"Dch-T8-hoF\"/>\n                    <simulatedStatusBarMetrics key=\"simulatedStatusBarMetrics\" statusBarStyle=\"lightContent\"/>\n                    <nil key=\"simulatedTopBarMetrics\"/>\n                    <connections>\n                        <outlet property=\"cropViewStoryboard\" destination=\"NNR-8r-Iig\" id=\"3tD-2Q-b5A\"/>\n                        <outlet property=\"navigationView\" destination=\"wMD-3V-hUT\" id=\"Tmh-Sx-tyS\"/>\n                        <outlet property=\"overlayActionView\" destination=\"yeD-f2-GC0\" id=\"ONk-aH-Jyg\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"vfa-Bq-aJk\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2038\" y=\"619\"/>\n        </scene>\n        <!--Cropped Image-->\n        <scene sceneID=\"uND-rV-bwv\">\n            <objects>\n                <viewController storyboardIdentifier=\"ImageViewController\" id=\"RKe-5g-3sC\" customClass=\"ImageViewController\" customModule=\"AKImageCropperViewExample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"3wc-Wp-Jyx\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"f21-mp-caw\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"s9k-zV-KY6\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qUK-T2-uUb\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"20\" width=\"375\" height=\"607\"/>\n                                <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                            </imageView>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"VWe-jo-ncG\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"627\" width=\"375\" height=\"40\"/>\n                                <subviews>\n                                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"nW8-ls-VF7\">\n                                        <rect key=\"frame\" x=\"8\" y=\"4\" width=\"38\" height=\"33\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                        <color key=\"tintColor\" red=\"0.0\" green=\"0.50196081400000003\" blue=\"1\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                        <state key=\"normal\" title=\"Back\">\n                                            <color key=\"titleShadowColor\" red=\"0.5\" green=\"0.5\" blue=\"0.5\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        </state>\n                                        <connections>\n                                            <action selector=\"backAction:\" destination=\"RKe-5g-3sC\" eventType=\"touchUpInside\" id=\"jKH-Ia-TmZ\"/>\n                                        </connections>\n                                    </button>\n                                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"GZk-pK-z6H\">\n                                        <rect key=\"frame\" x=\"277\" y=\"4\" width=\"90\" height=\"33\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                        <color key=\"tintColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <state key=\"normal\" title=\"IMAGE LIST\">\n                                            <color key=\"titleColor\" red=\"1\" green=\"0.40000000600000002\" blue=\"0.40000000600000002\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                            <color key=\"titleShadowColor\" red=\"0.5\" green=\"0.5\" blue=\"0.5\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        </state>\n                                        <connections>\n                                            <action selector=\"showListAction:\" destination=\"RKe-5g-3sC\" eventType=\"touchUpInside\" id=\"UiD-hZ-odJ\"/>\n                                        </connections>\n                                    </button>\n                                </subviews>\n                                <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"0.10000000000000001\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <constraints>\n                                    <constraint firstItem=\"GZk-pK-z6H\" firstAttribute=\"centerY\" secondItem=\"VWe-jo-ncG\" secondAttribute=\"centerY\" id=\"5IT-pI-LBa\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"GZk-pK-z6H\" secondAttribute=\"trailing\" constant=\"8\" id=\"Gtt-0A-EXc\"/>\n                                    <constraint firstItem=\"nW8-ls-VF7\" firstAttribute=\"centerY\" secondItem=\"VWe-jo-ncG\" secondAttribute=\"centerY\" id=\"aWr-jl-pAG\"/>\n                                    <constraint firstItem=\"nW8-ls-VF7\" firstAttribute=\"leading\" secondItem=\"VWe-jo-ncG\" secondAttribute=\"leading\" constant=\"8\" id=\"azT-mA-Kh1\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"40\" id=\"xdG-80-VrU\"/>\n                                </constraints>\n                            </view>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"VWe-jo-ncG\" secondAttribute=\"trailing\" id=\"66d-L6-YFi\"/>\n                            <constraint firstItem=\"VWe-jo-ncG\" firstAttribute=\"leading\" secondItem=\"s9k-zV-KY6\" secondAttribute=\"leading\" id=\"If3-9n-nK3\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"qUK-T2-uUb\" secondAttribute=\"trailing\" id=\"Umf-7n-wRw\"/>\n                            <constraint firstItem=\"f21-mp-caw\" firstAttribute=\"top\" secondItem=\"VWe-jo-ncG\" secondAttribute=\"bottom\" id=\"mLj-uD-q29\"/>\n                            <constraint firstItem=\"qUK-T2-uUb\" firstAttribute=\"leading\" secondItem=\"s9k-zV-KY6\" secondAttribute=\"leading\" id=\"nY3-UT-vp5\"/>\n                            <constraint firstItem=\"qUK-T2-uUb\" firstAttribute=\"top\" secondItem=\"3wc-Wp-Jyx\" secondAttribute=\"bottom\" id=\"x7h-gf-TAm\"/>\n                            <constraint firstItem=\"VWe-jo-ncG\" firstAttribute=\"top\" secondItem=\"qUK-T2-uUb\" secondAttribute=\"bottom\" id=\"xCs-wi-5cg\"/>\n                        </constraints>\n                    </view>\n                    <navigationItem key=\"navigationItem\" title=\"Cropped Image\" id=\"vfd-Eq-99c\"/>\n                    <connections>\n                        <outlet property=\"imageView\" destination=\"qUK-T2-uUb\" id=\"XRf-oF-d9n\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"ZVo-Oy-Yc0\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2887\" y=\"618\"/>\n        </scene>\n        <!--AKLocationManager-->\n        <scene sceneID=\"mR8-El-N3M\">\n            <objects>\n                <viewController id=\"o8A-Qi-PEH\" userLabel=\"AKLocationManager\" customClass=\"HomeViewController\" customModule=\"AKImageCropperViewExample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"ICs-CR-drR\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"QFS-sv-RYa\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"D8c-Xa-Pec\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Zeo-Cv-xbz\">\n                                <rect key=\"frame\" x=\"171.5\" y=\"249\" width=\"32\" height=\"1\"/>\n                                <color key=\"backgroundColor\" red=\"0.66666666666666663\" green=\"0.66666666666666663\" blue=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"1\" id=\"70Z-Eo-lef\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"32\" id=\"yKr-PU-ZjI\"/>\n                                </constraints>\n                            </view>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"uBf-yH-pWL\">\n                                <rect key=\"frame\" x=\"99\" y=\"282\" width=\"177\" height=\"30\"/>\n                                <state key=\"normal\" title=\"Select Image from Gallery\">\n                                    <color key=\"titleColor\" red=\"0.0\" green=\"0.47843137250000001\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                </state>\n                                <connections>\n                                    <action selector=\"galleryAction\" destination=\"o8A-Qi-PEH\" eventType=\"touchUpInside\" id=\"W7k-Kv-Dkl\"/>\n                                </connections>\n                            </button>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Responsive image cropper\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Cm5-TZ-NK7\">\n                                <rect key=\"frame\" x=\"16\" y=\"96\" width=\"343\" height=\"21\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <color key=\"textColor\" red=\"0.33333333333333331\" green=\"0.33333333333333331\" blue=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Demos\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"RnQ-Uu-Fqe\">\n                                <rect key=\"frame\" x=\"16\" y=\"214\" width=\"343\" height=\"27\"/>\n                                <fontDescription key=\"fontDescription\" style=\"UICTFontTextStyleTitle2\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"WB8-2V-Rsz\">\n                                <rect key=\"frame\" x=\"79\" y=\"344\" width=\"217\" height=\"30\"/>\n                                <state key=\"normal\" title=\"Select Image from Demo Folder\"/>\n                                <connections>\n                                    <segue destination=\"dCy-DU-1gs\" kind=\"show\" id=\"8va-bh-mBB\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"trailingMargin\" secondItem=\"Cm5-TZ-NK7\" secondAttribute=\"trailing\" id=\"16w-U8-opa\"/>\n                            <constraint firstItem=\"Cm5-TZ-NK7\" firstAttribute=\"top\" secondItem=\"ICs-CR-drR\" secondAttribute=\"bottom\" constant=\"32\" id=\"8a3-A9-iMG\"/>\n                            <constraint firstItem=\"Zeo-Cv-xbz\" firstAttribute=\"centerX\" secondItem=\"D8c-Xa-Pec\" secondAttribute=\"centerX\" id=\"B0r-iN-c8g\"/>\n                            <constraint firstItem=\"RnQ-Uu-Fqe\" firstAttribute=\"top\" secondItem=\"ICs-CR-drR\" secondAttribute=\"bottom\" constant=\"150\" id=\"DLc-Rl-yrZ\"/>\n                            <constraint firstItem=\"Cm5-TZ-NK7\" firstAttribute=\"leading\" secondItem=\"D8c-Xa-Pec\" secondAttribute=\"leadingMargin\" id=\"Ewe-Hk-hDu\"/>\n                            <constraint firstItem=\"WB8-2V-Rsz\" firstAttribute=\"centerX\" secondItem=\"D8c-Xa-Pec\" secondAttribute=\"centerX\" id=\"GXe-fv-L7v\"/>\n                            <constraint firstItem=\"WB8-2V-Rsz\" firstAttribute=\"top\" secondItem=\"uBf-yH-pWL\" secondAttribute=\"bottom\" constant=\"32\" id=\"Ihd-Ot-wYi\"/>\n                            <constraint firstItem=\"uBf-yH-pWL\" firstAttribute=\"centerX\" secondItem=\"D8c-Xa-Pec\" secondAttribute=\"centerX\" id=\"Pgv-SQ-HUN\"/>\n                            <constraint firstItem=\"uBf-yH-pWL\" firstAttribute=\"top\" secondItem=\"Zeo-Cv-xbz\" secondAttribute=\"bottom\" constant=\"32\" id=\"XeJ-EB-beG\"/>\n                            <constraint firstItem=\"Zeo-Cv-xbz\" firstAttribute=\"top\" secondItem=\"RnQ-Uu-Fqe\" secondAttribute=\"bottom\" constant=\"8\" id=\"hmX-w8-wSI\"/>\n                            <constraint firstItem=\"RnQ-Uu-Fqe\" firstAttribute=\"leading\" secondItem=\"D8c-Xa-Pec\" secondAttribute=\"leadingMargin\" id=\"rTj-hc-eRg\"/>\n                            <constraint firstAttribute=\"trailingMargin\" secondItem=\"RnQ-Uu-Fqe\" secondAttribute=\"trailing\" id=\"yWP-7s-GtS\"/>\n                        </constraints>\n                    </view>\n                    <navigationItem key=\"navigationItem\" title=\"AKImageCropperView\" id=\"Qt3-o7-Xus\"/>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"Qjw-UL-ejc\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"414\" y=\"619\"/>\n        </scene>\n        <!--Navigation Controller-->\n        <scene sceneID=\"khx-1F-DYa\">\n            <objects>\n                <navigationController automaticallyAdjustsScrollViewInsets=\"NO\" id=\"wQk-zT-bng\" sceneMemberID=\"viewController\">\n                    <toolbarItems/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"MxY-Fx-TEB\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <nil name=\"viewControllers\"/>\n                    <connections>\n                        <segue destination=\"o8A-Qi-PEH\" kind=\"relationship\" relationship=\"rootViewController\" id=\"52B-Rg-ppu\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"JuF-T7-bWT\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-377\" y=\"618\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"overlay\" width=\"22\" height=\"22\"/>\n        <image name=\"rotate\" width=\"22\" height=\"22\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "AKImageCropperViewExample/Constants.swift",
    "content": "//\n//  Constants.swift\n//  Demo\n//\n//  Created by Artem Krachulov on 11/18/16.\n//  Copyright © 2016 Artem Krachulov. All rights reserved.\n//\n\nimport Foundation\n\nstruct Constants {\n    \n    static let images = [\n        [\"Attractive-girl\", \"Autumn-background\", \"Colorful-pillows\"],\n        [\"Cupcakes\", \"Funnel-cake-stand\", \"Image-of-earth\"]\n    ]\n}\n"
  },
  {
    "path": "AKImageCropperViewExample/CropperViewController.swift",
    "content": "//\n//  CropperViewController.swift\n//\n//  Created by Artem Krachulov.\n//  Copyright (c) 2016 Artem Krachulov. All rights reserved.\n//  Website: http://www.artemkrachulov.com/\n//\n\nimport UIKit\nimport AKImageCropperView\n\nfinal class CropperViewController: UIViewController {\n    \n    //  MARK: - Properties\n    \n    var image: UIImage!\n    \n    // MARK: - Connections:\n    \n    // MARK: -- Outlets\n    \n    private var cropView: AKImageCropperView {\n        return cropViewProgrammatically ?? cropViewStoryboard\n    }\n    \n    @IBOutlet weak var cropViewStoryboard: AKImageCropperView!\n    private var cropViewProgrammatically: AKImageCropperView!\n    \n    @IBOutlet weak var overlayActionView: UIView!\n    \n    @IBOutlet weak var navigationView: UIView!\n    \n    // MARK: -- Actions\n    \n    @IBAction func backAction(_ sender: AnyObject) {\n        \n        guard !cropView.isEdited else {\n            \n            let alertController = UIAlertController(title: \"Warning!\", message:\n                \"All changes will be lost.\", preferredStyle: UIAlertControllerStyle.alert)\n            \n            alertController.addAction(UIAlertAction(title: \"Yes\", style: UIAlertActionStyle.cancel, handler: { _ in\n                \n                _ = self.navigationController?.popViewController(animated: true)\n            }))\n            \n            alertController.addAction(UIAlertAction(title: \"No\", style: UIAlertActionStyle.default, handler: nil))\n            \n            present(alertController, animated: true, completion: nil)\n            return\n        }\n        \n        _ = navigationController?.popViewController(animated: true)\n    }\n    \n    @IBAction func cropRandomAction(_ sender: AnyObject) {\n        \n//        cropView.setCropRectAnin(CGRect(x: 50, y: 200, width: 100, height: 100))\n        \n        \n        /*\n         let randomWidth = max(UInt32(cropView.configuration.cropRect.minimumSize.width), arc4random_uniform(UInt32(cropView.scrollView.frame.size.width)))\n         let randomHeight = max(UInt32(cropView.configuration.cropRect.minimumSize.height), arc4random_uniform(UInt32(cropView.scrollView.frame.size.height)))\n         let offsetX = CGFloat(arc4random_uniform(UInt32(cropView.scrollView.frame.size.width) - randomWidth))\n         let offsetY = CGFloat(arc4random_uniform(UInt32(cropView.scrollView.frame.size.height) - randomHeight))\n         \n         cropView.cropRect(CGRectMake(offsetX, offsetY, CGFloat(randomWidth), CGFloat(randomHeight)))*/\n    }\n    \n    @IBAction func randomImageAction(_ sender: AnyObject) {\n        let images = Constants.images.flatMap { $0 }\n        cropView.image = UIImage(named: images[Int(arc4random_uniform(UInt32(images.count)))])        \n        angle = 0.0\n    }\n    \n    @IBAction func cropImageAction(_ sender: AnyObject) {\n        \n         guard let image = cropView.croppedImage else {\n            return\n         }\n         \n         let imageViewController = UIStoryboard(name: \"Main\", bundle: nil).instantiateViewController(withIdentifier: \"ImageViewController\") as! ImageViewController\n         imageViewController.image = image\n         navigationController?.pushViewController(imageViewController, animated: true)\n    }\n    \n    @IBAction func showHideOverlayAction(_ sender: AnyObject) {\n        \n        if cropView.isoverlayViewActive {\n            \n            cropView.hideOverlayView(animationDuration: 0.3)\n            \n            UIView.animate(withDuration: 0.3, delay: 0, options: UIViewAnimationOptions.curveLinear, animations: {\n                self.overlayActionView.alpha = 0\n                \n            }, completion: nil)\n            \n        } else {\n            \n            cropView.showOverlayView(animationDuration: 0.3)\n            \n            UIView.animate(withDuration: 0.3, delay: 0.3, options: UIViewAnimationOptions.curveLinear, animations: {\n                self.overlayActionView.alpha = 1\n                \n            }, completion: nil)\n            \n        }\n    }\n    \n    var angle: Double = 0.0\n    \n    @IBAction func rotateAction(_ sender: AnyObject) {\n\n        angle += M_PI_2\n        \n        cropView.rotate(angle, withDuration: 0.3, completion: { _ in\n            \n            if self.angle == 2 * M_PI {\n                self.angle = 0.0\n            }\n        })\n    }\n    \n    @IBAction func resetAction(_ sender: AnyObject) {\n        \n        cropView.reset(animationDuration: 0.3)\n        angle = 0.0\n    }\n    \n    // MARK: -  Life Cycle\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        navigationController?.isNavigationBarHidden = true\n\n        // Programmatically initialization\n        \n        /*\n        cropViewProgrammatically = AKImageCropperView()\n        */\n        \n        // iPhone 4.7\"\n        \n        /*\n        cropViewProgrammatically = AKImageCropperView(frame: CGRect(x: 0, y: 20.0, width: 375.0, height: 607.0))\n        view.addSubview(cropViewProgrammatically)\n        */\n        \n        // with constraints\n        \n        /*\n        cropViewProgrammatically = AKImageCropperView()\n        cropViewProgrammatically.translatesAutoresizingMaskIntoConstraints = false\n        view.addSubview(cropViewProgrammatically)\n        \n        if #available(iOS 9.0, *) {\n            \n            cropViewProgrammatically.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true\n            cropViewProgrammatically.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true\n            topLayoutGuide.bottomAnchor.constraint(equalTo: cropViewProgrammatically.topAnchor).isActive = true\n            cropViewProgrammatically.bottomAnchor.constraint(equalTo: navigationView.topAnchor).isActive = true\n            \n        } else {\n            \n            for attribute: NSLayoutAttribute in [.top, .left, .bottom, .right] {\n                \n                var toItem: Any?\n                var toAttribute: NSLayoutAttribute!\n                \n                if attribute == .top {\n                    \n                    toItem = topLayoutGuide\n                    toAttribute = .bottom\n                    \n                } else if attribute == .bottom {\n                    \n                    toItem = navigationView\n                    toAttribute = .top\n                } else {\n                    toItem = view\n                    toAttribute = attribute\n                }\n                \n                view.addConstraint(\n                    NSLayoutConstraint(\n                        item: cropViewProgrammatically,\n                        attribute: attribute,\n                        relatedBy: NSLayoutRelation.equal,\n                        toItem: toItem,\n                        attribute: toAttribute,\n                        multiplier: 1.0, constant: 0))\n            }\n        }\n        */\n        \n\n        // Inset for overlay action view\n        \n        /*\n        cropView.overlayView?.configuraiton.cropRectInsets.bottom = 50\n        */\n        \n        // Custom overlay view configuration\n        \n        /*\n        var customConfiguraiton = AKImageCropperCropViewConfiguration()\n            customConfiguraiton.cropRectInsets.bottom = 50\n        cropView.overlayView = CustomImageCropperOverlayView(configuraiton: customConfiguraiton)\n        */\n        \n        cropView.delegate = self\n        cropView.image = image\n    }\n}\n\n//  MARK: - AKImageCropperViewDelegate\n\nextension CropperViewController: AKImageCropperViewDelegate {\n    \n    func imageCropperViewDidChangeCropRect(view: AKImageCropperView, cropRect rect: CGRect) {\n//        print(\"New crop rectangle: \\(rect)\")\n    }\n\n}\n"
  },
  {
    "path": "AKImageCropperViewExample/CustomImageCropperOverlayView.swift",
    "content": "//\n//  CustomImageCropperOverlayView.swift\n//  Demo\n//\n//  Created by Artem Krachulov on 11/28/16.\n//  Copyright © 2016 Artem Krachulov. All rights reserved.\n//\n\nimport Foundation\nimport AKImageCropperView\n\nfinal class CustomImageCropperOverlayView: AKImageCropperOverlayView {\n    \n    private func drawCycleInCornerView(_ view: UIView, inTouchView touchView: UIView, forState state: AKImageCropperCropViewTouchState) {\n        \n        var color: UIColor\n        var width: CGFloat\n        \n        if state == .normal {\n            color = configuraiton.corner.normalLineColor\n            width = configuraiton.corner.normalLineWidth\n        } else {\n            color = configuraiton.corner.highlightedLineColor\n            width = configuraiton.corner.highlightedLineWidth\n        }\n        \n        let layer: CAShapeLayer = view.layer.sublayers!.first as! CAShapeLayer\n        \n        let circlePath = UIBezierPath(\n            arcCenter:  CGPoint(x: touchView.bounds.midX, y: touchView.bounds.midY),\n            radius: width,\n            startAngle: 0.0,\n            endAngle: CGFloat(M_PI * 2),\n            clockwise: true)\n\n        layer.path = circlePath.cgPath\n        layer.fillColor = color.cgColor\n        layer.strokeColor = color.cgColor\n    }\n    \n    override func layoutTopLeftCornerView(_ view: UIView, inTouchView touchView: UIView, forState state: AKImageCropperCropViewTouchState) {\n        drawCycleInCornerView(view, inTouchView: touchView, forState: state)\n    }\n    \n    override func layoutTopRightCornerView(_ view: UIView, inTouchView touchView: UIView, forState state: AKImageCropperCropViewTouchState) {\n        drawCycleInCornerView(view, inTouchView: touchView, forState: state)\n    }\n    override func layoutBottomLeftCornerView(_ view: UIView, inTouchView touchView: UIView, forState state: AKImageCropperCropViewTouchState) {\n        drawCycleInCornerView(view, inTouchView: touchView, forState: state)\n    }\n    \n    override func layoutBottomRightCornerView(_ view: UIView, inTouchView touchView: UIView, forState state: AKImageCropperCropViewTouchState) {\n        drawCycleInCornerView(view, inTouchView: touchView, forState: state)\n    }\n}\n"
  },
  {
    "path": "AKImageCropperViewExample/HomeViewController.swift",
    "content": "//\n//  HomeViewController.swift\n//\n//  Created by Artem Krachulov.\n//  Copyright (c) 2016 Artem Krachulov. All rights reserved.\n//  Website: http://www.artemkrachulov.com/\n//\n\nimport UIKit\n\nfinal class HomeViewController: UIViewController {\n    \n    // MARK: - Connections:\n    \n    // MARK: -- Actions\n    \n    @IBAction func galleryAction() {\n        \n        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.savedPhotosAlbum) {\n            \n            let imagePicker = UIImagePickerController()\n            imagePicker.delegate = self\n            imagePicker.sourceType = UIImagePickerControllerSourceType.savedPhotosAlbum\n            imagePicker.allowsEditing = false\n            \n            present(imagePicker, animated: true, completion: nil)\n        }\n    }\n    \n    // MARK: - Life Cycle\n    \n    override func viewWillAppear(_ animated: Bool) {\n        super.viewWillAppear(animated)\n        \n        navigationController?.isNavigationBarHidden = false\n    }\n}\n\n// MARK: - UIImagePickerControllerDelegate\n\nextension HomeViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {\n    \n    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {\n        \n        if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {\n            \n            let cropperViewController = UIStoryboard(name: \"Main\", bundle: nil).instantiateViewController(withIdentifier: \"cropperViewController\") as! CropperViewController\n            cropperViewController.image = pickedImage\n            \n            picker.pushViewController(cropperViewController, animated: true)\n        }\n    }\n}\n"
  },
  {
    "path": "AKImageCropperViewExample/ImageViewController.swift",
    "content": "//\n//  ImageViewController.swift\n//\n//  Created by Artem Krachulov.\n//  Copyright (c) 2016 Artem Krachulov. All rights reserved.\n//  Website: http://www.artemkrachulov.com/\n//\n\nimport UIKit\n\nfinal class ImageViewController: UIViewController {\n    \n    // MARK: - Properties\n    \n    var image: UIImage!\n    \n    // MARK: - Connections:\n    \n    // MARK: -- Outlets\n    \n    @IBOutlet weak var imageView: UIImageView!\n    \n    // MARK: -- Actions\n    \n    @IBAction func backAction(_ sender: UIButton) {\n        \n        _ = navigationController?.popViewController(animated: true)\n    }\n    \n    @IBAction func showListAction(_ sender: UIButton) {\n        \n        if presentingViewController != nil {\n            \n            _ = navigationController?.popToRootViewController(animated: true)\n\n        } else {\n        \n            _ = navigationController?.popToViewController(navigationController!.viewControllers[1], animated: true)\n        }\n    }\n    \n    // MARK: - Life Cycle\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        imageView.image = image\n    }\n}\n"
  },
  {
    "path": "AKImageCropperViewExample/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"83.5x83.5\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AKImageCropperViewExample/Images.xcassets/Attractive-girl.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Attractive-girl-on-a-yacht-at-summer-day.jpg\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AKImageCropperViewExample/Images.xcassets/Autumn-background.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Autumn-background.jpg\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AKImageCropperViewExample/Images.xcassets/Colorful-pillows.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Colorful-pillows-on-a-sofa-with-white-brick-wall-in-background.jpg\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AKImageCropperViewExample/Images.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AKImageCropperViewExample/Images.xcassets/Cupcakes.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Cupcakes.jpg\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AKImageCropperViewExample/Images.xcassets/Funnel-cake-stand.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Funnel-cake-stand-at-a-fair.jpg\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AKImageCropperViewExample/Images.xcassets/Icons/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AKImageCropperViewExample/Images.xcassets/Icons/overlay.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"overlay.pdf\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}"
  },
  {
    "path": "AKImageCropperViewExample/Images.xcassets/Icons/random.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"random.pdf\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}"
  },
  {
    "path": "AKImageCropperViewExample/Images.xcassets/Icons/rotate.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rotate.pdf\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"properties\" : {\n    \"template-rendering-intent\" : \"template\"\n  }\n}"
  },
  {
    "path": "AKImageCropperViewExample/Images.xcassets/Image-of-earth.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Image-of-earth-planet.-Elements-of-this-image-are-furnished-by-NASA.jpg\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "AKImageCropperViewExample/ImagesTableViewController.swift",
    "content": "//\n//  ImagesTableViewController.swift\n//\n//  Created by Artem Krachulov.\n//  Copyright (c) 2016 Artem Krachulov. All rights reserved.\n//  Website: http://www.artemkrachulov.com/\n//\n\nimport UIKit\n\nfinal class ImagesTableViewController: UITableViewController {\n    \n    // MARK: - Life Cycle\n    \n    override func viewWillAppear(_ animated: Bool) {\n        super.viewWillAppear(animated)\n        \n        navigationController?.isNavigationBarHidden = false\n    }\n    \n    // MARK: - Navigation\n    \n    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {\n        \n        let selectedPath = tableView.indexPathForSelectedRow!\n        \n        (segue.destination as! CropperViewController).image = UIImage(named: Constants.images[selectedPath.section][selectedPath.row])\n    }\n}\n\n// MARK: - Table view data source\n\nextension ImagesTableViewController {\n    \n    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {\n        \n        return section == 0 ? \"Large\" : \"Small\"\n    }\n    \n    override func numberOfSections(in tableView: UITableView) -> Int {\n        \n        return Constants.images.count\n    }\n    \n    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        \n        return Constants.images[section].count\n    }\n    \n    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        \n        let cell = tableView.dequeueReusableCell(withIdentifier: \"image\", for: indexPath)\n        \n        let name = Constants.images[indexPath.section][indexPath.row]\n        let image = UIImage(named: name)\n        \n        // Configure the cell...\n        \n        cell.textLabel!.text = name.components(separatedBy: \"-\").joined(separator: \" \")\n        cell.detailTextLabel?.text = String(format: \"Size %0.1f x %0.1f\", image?.size.width as CGFloat!, image?.size.height as CGFloat!)\n        \n        return cell\n    }\n}\n"
  },
  {
    "path": "AKImageCropperViewExample/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>NSCameraUsageDescription</key>\n\t<string>$(PRODUCT_NAME) camera use</string>\n\t<key>NSPhotoLibraryUsageDescription</key>\n\t<string>$(PRODUCT_NAME) photo use</string>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2015-2016 Artem Krachulov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "README.md",
    "content": "# AKImageCropper\n\n> Responsive image cropper\n\n[![Carthage compatible][carthage-bage]][carthage-bage] \n[![CocoaPods Compatible][pods-bage]][pods-bage]\n\n[![Platform][platform-bage]][platform-bage]\n[![Swift Version][swift-bage]][swift-url]\n[![Build Status][travis-bage]][travis-url]\n[![License][license-bage]][license-url]\n\n[pods-bage]: https://img.shields.io/badge/COCOAPODS-compatible-fb0006.svg\n[pods-url]: https://cocoapods.org/\n[carthage-bage]: https://img.shields.io/badge/Carthage-compatible-brightgreen.svg\n[carthage-url]: https://github.com/Carthage/Carthage\n[platform-bage]: https://img.shields.io/cocoapods/p/LFAlertController.svg\n[platform-url]: http://cocoapods.org/pods/LFAlertController\n[swift-bage]:https://img.shields.io/badge/swift-3.0-orange.svg\n[swift-url]: https://swift.org/\n[license-bage]: https://img.shields.io/badge/License-MIT-blue.svg\n[license-url]: LICENSE\n[travis-bage]: https://img.shields.io/travis/dbader/node-datadog-metrics/master.svg\n[travis-url]: https://travis-ci.org/dbader/node-datadog-metrics\n\nImage cropping plugin which supported different devices orientation. Easy to set up and configure. Has many settings for flexible integration into your project. Behavior is similar to native iOS photo cropper.\n\n![](header.gif)\n\n## Features\n\n- [x] Overlay view & Crop rectangle full customization\n- [x] Flexible settings\n- [x] Image rotation\n- [x] Infinite \"Zoom To Fit\"\n- [x] Full image resolution\n- [x] Ability to draw custom crop rectangle\n\n## Requirements\n\n- iOS 8.0+\n- Xcode 7.3\n\n## Installation\n\n### CocoaPods\n\n[CocoaPods][] is a dependency manager for Cocoa projects. To install **AKImageCropperView** with CocoaPods:\n\n 1. Make sure CocoaPods is [installed][CocoaPods Installation].\n\n 2. Update your Podfile to include the following:\n\n``` ruby\nuse_frameworks!\npod 'AKImageCropperView'\n```\n\n 3. Run `pod install`.\n\n[CocoaPods]: https://cocoapods.org\n[CocoaPods Installation]: https://guides.cocoapods.org/using/getting-started.html#getting-started\n \n 4. In your code import **AKImageCropperView** like so: `import AKImageCropperView`\n\n### Carthage\n\n[Carthage][] is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.\nTo install **AKImageCropperView** with Carthage:\n\n1. Install Carthage via [Homebrew][]\n\n\t```bash\n\t$ brew update\n\t$ brew install carthage\n\t```\n\n2. Add `github \"artemkrachulov/AKImageCropperView\"` to your Cartfile.\n\n3. Run `carthage update`.\n\n4. Drag `AKMaskField.framework ` from the `Carthage/Build/iOS/` directory to the `Linked Frameworks and Libraries` section of your Xcode project’s `General` settings.\n\n5. Add `$(SRCROOT)/Carthage/Build/iOS/AKImageCropperView.framework ` to `Input Files` of Run Script Phase for Carthage.\n\n[Carthage]: https://github.com/Carthage/Carthage\n[Homebrew]: http://brew.sh\n\n### Manual\n\nIf you prefer not to use either of the aforementioned dependency managers, you can integrate **AKImageCropperView** into your project manually.\n\n1. Download and drop **AKImageCropperView** folder in your project.\n2. Done!\n\n## Usage example\n\n### Storyboard\n\n```swift\n@IBOutlet weak var cropView: AKImageCropperView!\n\noverride func viewDidLoad() {\n    super.viewDidLoad()\n\n    cropView.image = UIImage(named: \"yourImage\")\n}\n```\n\n### Programmatically\n\n```swift\nvar cropView: AKImageCropperView!\n\noverride func viewDidLoad() {\n    super.viewDidLoad()\n\n    cropView = AKImageCropperView(frame: CGRect(x: 0, y: 20.0, width: 375.0, height: 607.0))\n    cropView.image = UIImage(named: \"yourImage\")\n    view.addSubview(cropViewProgrammatically)\n}\n```\n\n> Full examples with constraint, delegates and Overlay view configuration check in demo project.\n> \n> **NOTE**: If after cropper view initialization your image has top inset. Go to storyboard with your scene and in the attributes inspector, uncheck 'Adjust Scrollview Insets'.\n\n## Initializing an Image Cropper View\n\n```swift\nfunc init(image: UIImage?)\n```\n\nReturns an image cropper view initialized with the specified image.\n\n**Parameters**\n\n- `image` : The initial image to display in the image cropper view.\n\t\n## Accessing the Displayed Images\n\n```swift\nvar image: UIImage? { get set }\n```\t\n\nThe image displayed in the image cropper view. \nDefault value of this property is `nil`.\n\n```swift\nvar croppedImage: UIImage? { get }\n```\t\n\nCropperd image in the specified crop rectangle.\n\n## Instance Properties\n\n```swift\nvar isEdited: UIImage? { get }\n```\t\n\nReturns the image edited state flag.\n\n## Managing the Delegate\n\n```swift\nweak var delegate: AKImageCropperViewDelegate? { get set }\n```\t\n\nThe delegate of the cropper view object.\n\n### Delegate methods\n\n```swift\noptional func imageCropperViewDidChangeCropRect(view: AKImageCropperView, cropRect rect: CGRect)\n```\t\n\nTells the delegate that crop frame was changed.\n\nParameters:\n\n- **`view`**: The image cropper view.\n- **`rect`**: New crop rectangle origin and size.\n\n## Customizing an Overlay View\n\n```swift\nvar overlayView: AKImageCropperOverlayView? { get set }\n```\t\n\nOverlay view represented as AKImageCropperOverlayView open class. \n\nBase configuration and behavior can be set or changed with **AKImageCropperOverlayConfiguration** structure. For deep visual changes create the children class and make the necessary configuration in the overrided methods.\n\n### Initializing an Overlay View\n\n```swift\ninit(configuraiton: AKImageCropperOverlayConfiguration? = default)\n```\n\nReturns an overlay view initialized with the specified configuraiton.\n\n### Base configuration \n\n```swift\nvar configuraiton: AKImageCropperOverlayConfiguration { get set }\n```\t\n\nConfiguration structure for the Overlay View appearance and behavior.\n\n#### AKImageCropperOverlayConfiguration\n\n```swift\nvar zoomingToFitDelay: TimeInterval { get set }\n```\t\n\nDelay before the crop rectangle will scale to fit cropper view frame. \nDefault value of this property is `2`.\n\n```swift\nvar animation: (duration: TimeInterval, options: UIViewAnimationOptions) { get set }\n```\t\n\nAnimation options for layout transitions. Values:\n\n- **`duration`** : The duration of the transition animation, measured in seconds. The default value is `300`.\n- **`options`** : Specifies the supported animation curves. The default value is `.curveEaseInOut`.\n\n```swift\nvar cropRectInsets: UIEdgeInsets { get set }\n```\t\n\nEdges insets for crop rectangle. Static values for programmatically rotation. \nDefault value of this property is `20` px for each edge.\n\n```swift\nvar minCropRectSize: CGSize { get set }\n```\t\n\nThe smallest value for the crop rectangle size. \nDefault value of this property is `60` pixels width and `60` pixels height.\n\n```swift\nvar cornerTouchSize: CGSize { get set }\n```\t\n\nTouch view where will be drawn the corner. \nDefault value of this property is `30` pixels width and `30` pixels height.\n\n```swift\nvar edgeThickness: (vertical: CGFloat, horizontal: CGFloat) { get set }\n```\t\n\nThickness for edges touch area. This touch view is centered on the edge line.\n\n- **`vertical`** : Thickness for vertical edges: Left, Right. The default value is `20`.\n- **`horizontal`** : Thickness for horizontal edges: Top, Bottom. The default value is `.curveEaseInOut`.\n\n```swift\nvar edge: AKImageCropperCropViewConfigurationOverlay { get set }\n```\t\n\nOverlay visual configuration.\n\n```swift\nvar edge: AKImageCropperCropViewConfigurationEdge { get set }\n```\t\n\nEdges visual configuration. Check this struct below.\n\n```swift\nvar corner: AKImageCropperCropViewConfigurationCorner { get set }\n```\t\n\nCorners visual configuration. Check this struct below.\n\n```swift\nvar grid: AKImageCropperCropViewConfigurationGrid { get set }\n```\n\nGrid visual configuration. Check this struct below. \n\n#### AKImageCropperCropViewConfigurationOverlay\n\n```swift\nvar backgroundColor: UIColor { get set }\n```\t\n\nThe view’s background color. \nDefault value is `. black` with alpha `0.5`.\n\n```swift\nvar isBlurEnabled: Bool { get set }\n```\t\n\nA Boolean value that determines whether the blur effect is enable.\nThe blur effect added over overlay view. The effect will disappear before user interaction will start. After manipulations, the effect will revert to the initial state.\nDefault value is `true`.\n\n```swift\nvar blurStyle: Bool { get set }\n```\t\n\nThe intensity of the blur effect.\nDefault value is `.dark`.\n\n```swift\nvar blurAlpha: Bool { get set }\n```\t\n\nThe blur effect alpha value.\nDefault value is `0.6`.\n\n#### AKImageCropperCropViewConfigurationEdge\n\n```swift\nvar isHidden: Bool { get set }\n```\t\n\nA Boolean value that determines whether the edge view is hidden. \nDefault value is `false`.\n\n```swift\nvar normalLineWidth: CGFloat { get set }\n```\t\n\nLine width for normal edge state. \nDefault value is `1.0`.\n\n```swift\nvar highlightedLineWidth: CGFloat { get set }\n```\t\n\nLine width for highlighted edge state. \nDefault value is `3.0`.\n\n```swift\nvar normalLineColor: UIColor { get set }\n```\t\n\nLine color for normal edge state. \nDefault value is `.white`.\n\n```swift\nvar highlightedLineColor: UIColor { get set }\n```\t\n\nLine color for highlighted edge state. \nDefault value is `white`.\n\n#### AKImageCropperCropViewConfigurationCorner\n\n```swift\nvar isHidden: Bool { get set }\n```\t\n\nA Boolean value that determines whether the corner view is hidden. \nDefault value is `false`.\n\n```swift\nvar normalLineWidth: CGFloat { get set }\n```\t\n\nLine width for normal corner state. \nDefault value is `3.0`.\n\n```swift\nvar highlightedLineWidth: CGFloat { get set }\n```\t\n\nLine width for highlighted corner state. \nDefault value is `3.0`.\n\n```swift    \nvar normaSize: CGSize { get set }\n```\t\n\nSize for normal corner state. \nDefault value is `20` pixels width and `20` pixels height.\n\n```swift\nvar highlightedSize: CGSize { get set }\n```\t\n    \nSize for highlighted corner state. \nDefault value is `30` pixels width and `30` pixels height.\n\n```swift\nvar normalLineColor: UIColor { get set }\n```\t\n\nLine color for normal corner state. \nDefault value is `.white`.\n\n```swift\nvar highlightedLineColor: UIColor { get set }\n```\t\n\nLine color for highlighted corner state. \nDefault value is `.white`.\n\n#### AKImageCropperCropViewConfigurationGrid\n\n```swift\nvar isHidden: Bool { get set }\n```\t\n\nA Boolean value that determines whether the grid views is hidden. \nDefault value is `false`.\n\n```swift\nvar autoHideGrid: Bool { get set }\n```\t\n\nHide grid after user interaction. \nDefault value is `true`.\n\n```swift\nvar linesCount: (vertical: Int, horizontal: Int) { get set }\n```\t\n\nThe number of vertical and horizontal lines inside the crop rectangle.\n\n- **`vertical`** : Vertical lines count. The default value is `2`.\n- **`horizontal`** : Horizontal lines count. The default value is `2`.\n\n```swift\nvar linesWidth: CGFloat { get set }\n```\t\n\nVertical and horizontal lines width.\nDefault value is `1.0`.\n\n```swift\nvar linesColor: UIColor { get set }\n```\t\n\nVertical and horizontal lines color. \nDefault value is `white` with alpha `0.5`. \n\n#### Visual Appearance\n\n```swift\nfunc layoutTopEdgeView(_ view: UIView, inTouchView touchView: UIView, forState state: AKCropAreaPartState)\n```\t\n\nVisual representation for top edge view in current user interaction state.\n\nParameters:\n\n- **`view`**: Top edge view.\n- **`touchView`**: Touch area view where added top edge view.\n- **`state`**: User interaction state.\n\n```swift\nfunc layoutRightEdgeView(_ view: UIView, inTouchView touchView: UIView, forState state: AKCropAreaPartState)\n```\t\n\nVisual representation for right edge view in current user interaction state.\n\nParameters:\n\n- **`view`**: Right edge view.\n- **`touchView`**: Touch area view where added right edge view.\n- **`state`**: User interaction state.\n\n```swift\nfunc layoutBottomEdgeView(_ view: UIView, inTouchView touchView: UIView, forState state: AKCropAreaPartState)\n```\t\n\nVisual representation for bottom edge view in current user interaction state.\n\nParameters:\n\n- **`view`**: Bottom edge view.\n- **`touchView`**: Touch area view where added bottom edge view.\n- **`state`**: User interaction state.\n\n```swift\nfunc layoutLeftEdgeView(_ view: UIView, inTouchView touchView: UIView, forState state: AKCropAreaPartState)\n```\t\n\nVisual representation for left edge view in current user interaction state.\n\nParameters:\n\n- **`view`**: Left edge view.\n- **`touchView`**: Touch area view where added left edge view.\n- **`state`**: User interaction state.\n\n```swift\nfunc layoutTopLeftCornerView(_ view: UIView, inTouchView touchView: UIView, forState state: AKCropAreaPartState)\n```\t\n\nVisual representation for top left corner view in current user interaction state. Drawing going with added shape layer.\n\nParameters:\n\n- **`view`**: Top left corner view.\n- **`touchView`**: Touch area view where added top left edge view.\n- **`state `**: User interaction state.\n\n```swift\nfunc layoutTopRightCornerView(_ view: UIView, inTouchView touchView: UIView, forState state: AKCropAreaPartState)\n```\t\n\nVisual representation for top right corner view in current user interaction state. Drawing going with added shape layer.\n\nParameters:\n\n- **`view`**: Top right corner view.\n- **`touchView`**: Touch area view where added top right edge view.\n- **`state `**: User interaction state.\n\n```swift\nfunc layoutBottomRightCornerView(_ view: UIView, inTouchView touchView: UIView, forState state: AKCropAreaPartState)\n```\t\n\nVisual representation for bottom right corner view in current user interaction state. Drawing going with added shape layer.\n\nParameters:\n\n- **`view`**: Bottom right corner view.\n- **`touchView`**: Touch area view where added bottom right edge view.\n- **`state `**: User interaction state.\n\n```swift\nfunc layoutBottomLeftCornerView(_ view: UIView, inTouchView touchView: UIView, forState state: AKCropAreaPartState)\n```\t\n\nVisual representation for bottom left corner view in current user interaction state. Drawing going with added shape layer.\n\nParameters:\n\n- **`view`**: Bottom left corner view.\n- **`touchView`**: Touch area view where added bottom left edge view.\n- **`state `**: User interaction state.\n\n```swift\nfunc layoutGridView(_ view: UIView, gridViewHorizontalLines: [UIView], gridViewVerticalLines: [UIView])\n```\t\n\nVisual representation for grid view.\n\nParameters:\n\n- **`view`**: Grid view.\n- **`gridViewHorizontalLines`**: Horizontal line view`s array.\n- **`gridViewVerticalLines `**: Vertical line view`s array.\n\n## Contribute\n\nPlease do not forget to ★ this repository to increases its visibility and encourages others to contribute. \n\nGot a bug fix, or a new feature? Create a pull request and go for it!\n\n## Meta\n\nArtem Krachulov – [www.artemkrachulov.com](http://www.artemkrachulov.com/) - [artem.krachulov@gmail.com](mailto:artem.krachulov@gmail.com)\n\nReleased under the [MIT license](http://www.opensource.org/licenses/MIT)\n\n[https://github.com/artemkrachulov](https://github.com/dbader/)"
  }
]