{
  "TypeId": "ScriptDemosaicingAlgorithm",
  "Version": 1,
  "Id": "2eb25c0f-9612-480b-80ae-f4037e4ad786",
  "DisplayName": "Bilinear - C#",
  "SupportedBayerPatterns": [
    "BGGR_2x2",
    "GBRG_2x2",
    "GRBG_2x2",
    "RGGB_2x2",
    "BGGR_4x4",
    "GBRG_4x4",
    "GRBG_4x4",
    "RGGB_4x4"
  ],
  "IsDedicatedOutputBufferNeeded": false,
  "DemosaicingScript": {
    "Language": "CSharp_14",
    "Source": "Ly8gcHJlcGFyZSB0aGUgcmVzdWx0IHRvIHJlcG9ydAp2YXIgcmVzdWx0ID0gRGVtb3NhaWNpbmdSZXN1bHQuRGVmYXVsdDsKCi8vIGNoZWNrIHRoZSBmb3JtYXQgb2YgdGhlIGJ1ZmZlcnMsIHRoaXMgc2NyaXB0IHJlYWRzIGFuZCB3cml0ZXMgMTYtYml0IGNvbG9yIGNoYW5uZWxzIG9ubHkKaWYgKENvbnRleHQuRm9ybWF0ICE9IEJpdG1hcEZvcm1hdC5CZ3JhNjQpCiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJPbmx5IDY0LWJpdCBCR1JBIGlzIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdC4iKTsKCi8vIGludGVycG9sYXRlIG9uZSBtb3NhaWMsIHdoaWNoIGlzIHRoZSBpbWFnZSBpdHNlbGYgd2hlbiBpdHMgcGF0dGVybiBpcyAyeDIgYW5kIG9uZSBvZiB0aGUgNCBwaGFzZXMgb2YgdGhlIGltYWdlIHdoZW4gaXQgaXMgNHg0CmJvb2wgSW50ZXJwb2xhdGVNb3NhaWMoSU1vc2FpY1ZpZXcgbW9zYWljKQp7CiAgICAvLyBjb3B5IHRoZSBjb2xvciBwYXR0ZXJuIGludG8gcGxhaW4gaW50ZWdlcnMsIHRoZSB2YWx1ZSBvZiBlYWNoIGNvbXBvbmVudCBpcyB0aGUgb2Zmc2V0IG9mIGl0cyBjaGFubmVsIGluIGEgQkdSQSBwaXhlbAogICAgdmFyIGNvbG9yUGF0dGVybiA9IG1vc2FpYy5Db2xvclBhdHRlcm47CiAgICBpZiAoY29sb3JQYXR0ZXJuLkxlbmd0aCAhPSAyIHx8IGNvbG9yUGF0dGVyblswXS5MZW5ndGggIT0gMikKICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJPbmx5IDJ4MiBwYXR0ZXJucyBvZiBCYXllciBGaWx0ZXIgYXJlIHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdC4iKTsKICAgIGludFtdW10gcGF0dGVybiA9CiAgICBbCiAgICAgICAgWyAoaW50KWNvbG9yUGF0dGVyblswXVswXSwgKGludCljb2xvclBhdHRlcm5bMF1bMV0gXSwKICAgICAgICBbIChpbnQpY29sb3JQYXR0ZXJuWzFdWzBdLCAoaW50KWNvbG9yUGF0dGVyblsxXVsxXSBdLAogICAgXTsKCiAgICAvLyBwcmVwYXJlIHRoZSBnZW9tZXRyeSBhbmQgdGhlIHN0cmVhbXMsIHdoaWNoIGJlbG9uZyB0byB0aGlzIG1vc2FpYyBhbmQgbm90IHRvIHRoZSBpbWFnZQogICAgdmFyIHdpZHRoID0gbW9zYWljLldpZHRoOwogICAgdmFyIGhlaWdodCA9IG1vc2FpYy5IZWlnaHQ7CiAgICB2YXIgbGFzdFggPSB3aWR0aCAtIDE7CiAgICB2YXIgbGFzdFkgPSBoZWlnaHQgLSAxOwogICAgdmFyIGNvbXBvbmVudENvdW50ID0gd2lkdGggKiA0OwogICAgdmFyIGlucHV0U3RyZWFtID0gbW9zYWljLklucHV0U3RyZWFtOwogICAgdmFyIG91dHB1dFN0cmVhbSA9IG1vc2FpYy5PdXRwdXRTdHJlYW07CiAgICBpbnB1dFN0cmVhbS5Qb3NpdGlvbiA9IDA7CiAgICBvdXRwdXRTdHJlYW0uUG9zaXRpb24gPSAwOwoKICAgIC8vIHByZXBhcmUgdGhlIGJ1ZmZlcnMsIHRoZSBhcnJheXMgY3JlYXRlZCBieSB0aGUgY29udGV4dCBhcmUgdGhlIG9uZXMgd2hpY2ggdGhlIGJ1bGsgaGVscGVycyBmaWxsIGFuZCB3cml0ZSBkaXJlY3RseQogICAgdmFyIGlucHV0QnVmZmVyID0gbmV3IHVzaG9ydFtjb21wb25lbnRDb3VudF07CiAgICB2YXIgb3V0cHV0QnVmZmVyID0gbmV3IHVzaG9ydFtjb21wb25lbnRDb3VudF07CiAgICB2YXIgYWJvdmUgPSBuZXcgaW50W3dpZHRoXTsKICAgIHZhciBjdXJyZW50ID0gbmV3IGludFt3aWR0aF07CiAgICB2YXIgYmVsb3cgPSBuZXcgaW50W3dpZHRoXTsKCiAgICAvLyByZWFkIG9uZSByb3cgb2YgdGhlIG1vc2FpYyBhbmQga2VlcCB0aGUgc2luZ2xlIGRlZmluZWQgY29sb3IgY2hhbm5lbCBvZiBlYWNoIG9mIGl0cyBwaXhlbHMKICAgIHZvaWQgUmVhZE1vc2FpY1JvdyhpbnQgeSwgaW50W10gc2FtcGxlcykKICAgIHsKICAgICAgICBpbnB1dFN0cmVhbS5SZWFkVUludDE2RXhhY3QoaW5wdXRCdWZmZXIsIDAsIGNvbXBvbmVudENvdW50KTsKICAgICAgICB2YXIgY29tcG9uZW50cyA9IHBhdHRlcm5beSAmIDFdOwogICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgd2lkdGg7ICsreCkKICAgICAgICAgICAgc2FtcGxlc1t4XSA9IGlucHV0QnVmZmVyW3ggKiA0ICsgY29tcG9uZW50c1t4ICYgMV1dOwogICAgfQoKICAgIC8vIHByaW1lIHRoZSB3aW5kb3cgd2l0aCB0aGUgZmlyc3Qgcm93LCB0aGUgcm93IGFib3ZlIGl0IGlzIHRoZSByb3cgaXRzZWxmCiAgICBSZWFkTW9zYWljUm93KDAsIGN1cnJlbnQpOwogICAgQXJyYXkuQ29weShjdXJyZW50LCBhYm92ZSwgd2lkdGgpOwoKICAgIC8vIGludGVycG9sYXRlIHRoZSBtb3NhaWMgcm93IGJ5IHJvdywga2VlcGluZyBvbmx5IHRoZSAzIHJvd3Mgd2hpY2ggdGhlIDN4MyB3aW5kb3cgbmVlZHMKICAgIGZvciAodmFyIHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpCiAgICB7CiAgICAgICAgLy8gc3RvcCBhcyBlYXJseSBhcyBwb3NzaWJsZSBpZiB0aGUgcmVuZGVyaW5nIGhhcyBiZWVuIGNhbmNlbGxlZAogICAgICAgIGlmIChJc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICAvLyByZWFkIHRoZSByb3cgYmVsb3csIG9yIGV4dGVuZCB0aGUgYm90dG9tIGJvcmRlciBieSB0aGUgbGFzdCByb3cKICAgICAgICBpZiAoeSA8IGxhc3RZKQogICAgICAgICAgICBSZWFkTW9zYWljUm93KHkgKyAxLCBiZWxvdyk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBBcnJheS5Db3B5KGN1cnJlbnQsIGJlbG93LCB3aWR0aCk7CgogICAgICAgIC8vIHNlbGVjdCB0aGUgY29tcG9uZW50cyBwcm92aWRlZCBieSB0aGUgcGl4ZWxzIG9mIHRoaXMgcm93IGFuZCBieSB0aGUgcGl4ZWxzIG9mIHRoZSByb3dzIGJlc2lkZSBpdAogICAgICAgIHZhciByb3dDb21wb25lbnRzID0gcGF0dGVyblt5ICYgMV07CiAgICAgICAgdmFyIG5laWdoYm9yQ29tcG9uZW50cyA9IHBhdHRlcm5bKHkgKyAxKSAmIDFdOwoKICAgICAgICAvLyBpbnRlcnBvbGF0ZSBldmVyeSBwaXhlbCBvZiB0aGUgcm93CiAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB3aWR0aDsgKyt4KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHBhcml0eSA9IHggJiAxOwogICAgICAgICAgICB2YXIgb3duQ29tcG9uZW50ID0gcm93Q29tcG9uZW50c1twYXJpdHldOwogICAgICAgICAgICB2YXIgaG9yaXpvbnRhbENvbXBvbmVudCA9IHJvd0NvbXBvbmVudHNbMSAtIHBhcml0eV07CiAgICAgICAgICAgIHZhciB2ZXJ0aWNhbENvbXBvbmVudCA9IG5laWdoYm9yQ29tcG9uZW50c1twYXJpdHldOwogICAgICAgICAgICB2YXIgZGlhZ29uYWxDb21wb25lbnQgPSBuZWlnaGJvckNvbXBvbmVudHNbMSAtIHBhcml0eV07CiAgICAgICAgICAgIHZhciBsZWZ0ID0geCA\u002BIDAgPyB4IC0gMSA6IDA7CiAgICAgICAgICAgIHZhciByaWdodCA9IHggPCBsYXN0WCA/IHggKyAxIDogbGFzdFg7CiAgICAgICAgICAgIHZhciBvZmZzZXQgPSB4ICogNDsKICAgICAgICAgICAgb3V0cHV0QnVmZmVyW29mZnNldCArIG93bkNvbXBvbmVudF0gPSAodXNob3J0KWN1cnJlbnRbeF07CiAgICAgICAgICAgIGlmIChob3Jpem9udGFsQ29tcG9uZW50ID09IHZlcnRpY2FsQ29tcG9uZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBhIHJlZCBvciBibHVlIHBpeGVsLCBncmVlbiBjb21lcyBmcm9tIHRoZSA0IHBpeGVscyBiZXNpZGUgaXQgYW5kIHRoZSByZW1haW5pbmcgY29tcG9uZW50IGZyb20gdGhlIDQgZGlhZ29uYWwgb25lcwogICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyW29mZnNldCArIGhvcml6b250YWxDb21wb25lbnRdID0gKHVzaG9ydCkoKGN1cnJlbnRbbGVmdF0gKyBjdXJyZW50W3JpZ2h0XSArIGFib3ZlW3hdICsgYmVsb3dbeF0pID4\u002BIDIpOwogICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyW29mZnNldCArIGRpYWdvbmFsQ29tcG9uZW50XSA9ICh1c2hvcnQpKChhYm92ZVtsZWZ0XSArIGFib3ZlW3JpZ2h0XSArIGJlbG93W2xlZnRdICsgYmVsb3dbcmlnaHRdKSA\u002BPiAyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIGEgZ3JlZW4gcGl4ZWwsIHRoZSAyIHJlbWFpbmluZyBjb21wb25lbnRzIGNvbWUgZnJvbSB0aGUgcGl4ZWxzIGJlc2lkZSBpdCBhbmQgZnJvbSB0aGUgcGl4ZWxzIGFib3ZlIGFuZCBiZWxvdyBpdAogICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyW29mZnNldCArIGhvcml6b250YWxDb21wb25lbnRdID0gKHVzaG9ydCkoKGN1cnJlbnRbbGVmdF0gKyBjdXJyZW50W3JpZ2h0XSkgPj4gMSk7CiAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJbb2Zmc2V0ICsgdmVydGljYWxDb21wb25lbnRdID0gKHVzaG9ydCkoKGFib3ZlW3hdICsgYmVsb3dbeF0pID4\u002BIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG91dHB1dEJ1ZmZlcltvZmZzZXQgKyAzXSA9IDY1NTM1OwogICAgICAgIH0KCiAgICAgICAgLy8gd3JpdGUgdGhlIGludGVycG9sYXRlZCByb3cgYW5kIG1vdmUgdGhlIHdpbmRvdyBkb3duLCByZXVzaW5nIHRoZSByb3cgd2hpY2ggaGFzIGp1c3QgbGVmdCBpdAogICAgICAgIG91dHB1dFN0cmVhbS5Xcml0ZVVJbnQxNihvdXRwdXRCdWZmZXIsIDAsIGNvbXBvbmVudENvdW50KTsKICAgICAgICAoYWJvdmUsIGN1cnJlbnQsIGJlbG93KSA9IChjdXJyZW50LCBiZWxvdywgYWJvdmUpOwogICAgfQoKICAgIC8vIHJlcG9ydCB0aGF0IHRoZSB3aG9sZSBtb3NhaWMgaGFzIGJlZW4gaW50ZXJwb2xhdGVkCiAgICByZXR1cm4gdHJ1ZTsKfQoKLy8gaW50ZXJwb2xhdGUgdGhlIHN1YiBtb3NhaWNzIG9uZSBieSBvbmUsIGEgMngyIG1vc2FpYyBpcyBoYW5kZWQgb3V0IG9uY2UgYXMgdGhlIG9ubHkgb25lIGFuZCBhIDR4NCBtb3NhaWMgYXMgdGhlIDQgMngyIG1vc2FpY3MgaXRzIHBoYXNlcyBjYXJyeQp2YXIgc3ViTW9zYWljID0gQ29udGV4dC5TZWxlY3ROZXh0U3ViTW9zYWljKCk7CndoaWxlIChzdWJNb3NhaWMgaXMgbm90IG51bGwpCnsKICAgIGlmICghSW50ZXJwb2xhdGVNb3NhaWMoc3ViTW9zYWljKSkKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgc3ViTW9zYWljID0gQ29udGV4dC5TZWxlY3ROZXh0U3ViTW9zYWljKCk7Cn0KCnJldHVybiByZXN1bHQ7Cg=="
  }
}