* First commit with very rough solution.
* Solidify solutions for both requirements. Add new tests. Enhance others.
* Spotless.
* Add new chained sort spec algorithm. Add new Msg.codes. Finalize tests. Update docs. Add changelog.
* Fixing issues with postgres LOB migration.
* addressing code review comments for audit/transaction logs.
* test and implementation for BinaryStorageEntity migration post code review.
* test and implementation for BinaryStorageEntity migration post code review.
* test and implementation for TermConcept
migration post code review.
* applying spotless
* test and implementation for TermConceptProperty
migration post code review.
* test and implementation for TermValueSetConcept
migration post code review.
* fixing migration version
* fixing migration task
* changelog
* fixing changelog
* Minor renames
* addressing comments and suggestions from second code review.
* passing tests
* fixing more tests
---------
Co-authored-by: peartree <etienne.poirier@smilecdr.com>
Co-authored-by: Tadgh <garygrantgraham@gmail.com>
* Failing test.
* Ensure test cleanup doesn't fail by deleting Patients before Practitioners.
* Implement fix.
* Spotless.
* Clean up unit test and add changelog. Fix unit test.
* Fix changelog file.
* Apply suggestions from code review
Apply code review suggestions.
Co-authored-by: Michael Buckley <michaelabuckley@gmail.com>
* Spotless
---------
Co-authored-by: Michael Buckley <michaelabuckley@gmail.com>
* Try making ResourceTable.myTags EAGER instead of LAZY and see if it breaks anything.
* Try making ResourceTable.myTags EAGER instead of LAZY and see if it breaks anything.
* Ensure BaseHapiFhirResourceDao#metaGetOperation uses HapiTransactionService instead of @Transactional in order to resolve megascale $meta bug.
* Add changelog.
* Update hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/7_2_0/5898-ld-megascale-meta-operation-fails-hapi-0389.yaml
Commit code reviewer suggestion.
Co-authored-by: Tadgh <garygrantgraham@gmail.com>
---------
Co-authored-by: Tadgh <garygrantgraham@gmail.com>
* Expose BaseRequestPartitionHelperSvc validate and normalize methods
* Compilation errors
* change mock test to jpa test
* change mock test to jpa test
* validateAndNormalizePartitionIds
* validateAndNormalizePartitionNames
* validateAndNormalizePartitionIds validation + bug fix
* validateAndNormalizePartitionNames validation
* fix test
* version bump
* updating parent pids column name
* updating name of the fullTestField Search
* updating name of the fullTestField Search
* fixing typo.
* failing test.
* - Moving FullTextField annotation from getter method and adding it to the newly added VC property of the entity;
- reverting the name of the FullTextField entity to its previous name of 'myParentPids';
- reverting the name of the lucene index to search on in the terminology service.
- updating the changelog;
* making spotless happy
---------
Co-authored-by: peartree <etienne.poirier@smilecdr.com>
* collect-data and data-requirements operations and tests
* remove unused imports
* additional test coverage
* move assertions out of method to pass static code analysis
* camelCase test names
* remove underscore on test methods
* requested edits to changelog
* version bump to 7.1.10-SNAPSHOT
* condense unit tests to prevent pipeline timeout
* method camel case naming
* Add support for latest version of CR and new $questionnaire operation
* Fix formatting in javadoc causing warning
* Update to 3.0.0 CR release
* Add support for expected parameter names from updated IG's
* Update Clinical Reasoning documentation
* Update pom.xml
* Create 5750-update-cr-operations.yaml
* fix doc
* Update to latest CR version
* Update pom.xml
* In version
* Update changelog
* Remove commented code
* Reducer LOB usage in Batch2 and Search (#5748)
* Reducer LOB usage in Batch2 and Search
* Add changelog
* Rework a number of LOB columns
* Test fix
* Test fix
* Column fixes
* Test fix
* Formatting
* Fixes
* patching bad oracle test
* Apply spotless
---------
Co-authored-by: Tadgh <garygrantgraham@gmail.com>
* Clean up
* Revert change
* One more revert
* Resolve compile issue
---------
Co-authored-by: Tadgh <garygrantgraham@gmail.com>
* Add SQL logging: Attempt to add test.
* Small fix.
* moar tests
* Tweak unit tests to be parameterized.
* Enhance tests and more logging.
* Better tests. More logging. More TODOs.
* Better tests. More logging. More TODOs.
* Changes
* Changes
* Updates to tests. More logging and experimental code.
* Introduce fix along with more logging and TODOs and tweaks to tests.
* Cleanup solution. Get rid of logs and todos. Rename test class, test methods and clean up unnecessary code.
* Add changelog.
* Implement simpler chain algorithm without conditional logic and leave a long comment explaining why.
* Implement simpler chain algorithm without conditional logic and leave a long comment explaining why.
* Fix comment.
---------
Co-authored-by: Ken Stevens <khstevens@gmail.com>
* pom bump to 7.0.0 (#5615)
* pom bump to 7.0.0
* add version enum
* fixed feb release name
---------
Co-authored-by: Long Ma <long@smilecdr.com>
* Check index existence on raw SQL creation (#5624)
* Add conditional check on index existence before we try again
* Add conditional check on index existence before we try again
* Changelog
* remit
* remit
* debug statements
* 5621 deadlock on caffeine cache when creating a resource with conditional create (#5622)
* Modifying the CacheProvider to avoid doing db I/O within the cache miss value supplier callback.
* Setting the initial capacity of instantiated caches to the cache max size to avoid resizing during operations.
* adding changelog and spotless.
* Fixing typo.
* Addressing comments from code review.
---------
Co-authored-by: peartree <etienne.poirier@smilecdr.com>
* Searching with more than one chained Bundle SearchParameter returns incorrect results (#5614)
* Failing test
* fix
* changelog
* Avoiding Exception being thrown on @EventListener invocation (#5628)
* replaced EventListener annotation with @PreDestroy
* adding changelog
---------
Co-authored-by: peartree <etienne.poirier@smilecdr.com>
* simple fix (#5630)
Co-authored-by: Long Ma <long@smilecdr.com>
* Incorrect version of auto versioned reference for conditional update with urn id placeholder (#5625)
* Incorrect version from versioned_references.auto_at_paths for conditional update - implementation
* Oracle: Ensure migrated database still takes large resource text updates (#5629)
* First pass at fix to Oracle HFJ_RES_VER.RES_TEXT_VC migration.
* First stab at agreed upon solution.
* Fix error with 4001 by removing unnecessary annotation.
* Spotless and TODO.
* Remove annotation for good and set length to LONG32.
* Fix copyright year.
* Finalize changelog.
* Remove migration changes. Fix unit test.
* Fix compile error.
* Log output.
* Refactor resource history code into new ResourceHistoryCalculator.
* Spotless.
* Convert record to POJO.
* Restore pre-17 switch statement.
* Finalize new resource history calculator code and tests.
* Spotless.
* Remove logging.
* Update hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/7_0_0/5633-oracle-hfj-res-ver-clob-migration.yaml
Apply code reviewer suggestion
Co-authored-by: Michael Buckley <michaelabuckley@gmail.com>
* Code review feedback.
---------
Co-authored-by: Michael Buckley <michaelabuckley@gmail.com>
* Fix expansion for `ValueSet` with no concepts based on CodeSystem `urn:ietf:bcp:13` (#5638)
* When fetching the mimetype code system, return empty CodeSystem with NOTSUPPORTED content. Update expansion logic to handle this case. Add some test cases.
* Minor change to fix test
* Rename changelog file
* Remove TODOs as they're replaced by reported issue
* Revert accidental change added with TODO removal
* $expunge operation ignoring ExpungeThreadCount setting in certain cases (#5637)
* $expunge operation ignoring ExpungeThreadCount setting in certain cases - implementation
* Fix Measure group id null pointer exception (#5620)
* Update to new version of clinical reasoning, includes a fix for null pointers on Measure group id
* add changelog
---------
Co-authored-by: Justin McKelvy <60718638+Capt-Mac@users.noreply.github.com>
* Rule evaluation: Allow Bundles with PATCH Parameters (#5641)
* Remove parameters clause.
* Finalize changelog. Add tests. Finalize implementation.
* Undo changes to this test.
* Revert all changes to FhirQueryRuleImplTest. Add new RuleImplOpTest. Ensure that proper nested Bundle is created for test and other fixes.
* Tweak test.
* Use real rule applier in test and remove all mocks.
* Prevent batch2 job execution to stop for empty chunk when last job st… (#5635)
* Prevent batch2 job execution to stop for empty chunk when last job step is a reduction.
Add output to bulk export result even when empty.
* Fix test
* Unimportant change to force fresh build
* Implement review suggestions
---------
Co-authored-by: juan.marchionatto <juan.marchionatto@smilecdr.com>
* Index review fixes (#5649)
* Don't hold locks while adding indices during upgrade.
* concurrent indexing is non-transactional in PG.
* Fix conditional creates without leading '?' (#5646)
* First commit with failing test.
* More tests and logs.
* More logs
* Try new solution for BaseTransactionProcessor.performIdSubstitutionsInMatchUrl().
* Simplify solution. Add more tests.
* Changelog.
* javadoc
* Searching for Bundles with read all Bundles permission returns 403 (#5644)
* failing test
* another failing test case
* fix
* changelog
* fix bug
* spotless
* cr
* Fix NullPointerException when performing a system bulk export in the presence of PatientIdPartitionInterceptor. (#5660)
* Bump json-path
* Pin parrson
* Bump elastic
* Bump spring version
* Exclude JDBC
* Serializing changes for sensitive data (#5655)
* Add new senstiive data serializer
* Add new senstiive data serializer
* Add new senstiive data serializer
* Remove dead comments
* Change up the test
* review comments
* wip
* Tighten tests and push annotation down
* Tighten tests and push annotation down
* Changelog
* Add test
* 7.0.1-SNAPSHOT bump
* Error code
* Add method used by CDR
* add version enum
* Fix test
* Revert change to other safe version to stop problem with deprecated field
* Rel 7 0 CVE (#5663)
* Bump json-path
* Pin parrson
* Bump elastic
* Bump spring version
* Exclude JDBC
* Descendent fix (#5669)
* Fix "is-a" ValueSet expansion, add "descendent-of" support
* Fixed tests in DSTU3 and R5
* Trigger new build
* Revert "Trigger new build"
This reverts commit 46c672b338.
* fix default partition setting on resource (#5617)
* fix default partition setting on resource
* changelog
* Handle DEFAULT partition in rule checker.
* Fix spotless
---------
Co-authored-by: Michael Buckley <michaelabuckley@gmail.com>
Co-authored-by: James Agnew <jamesagnew@gmail.com>
* pom bump, doc add, version enum add (#5616)
Co-authored-by: Long Ma <long@smilecdr.com>
* fix default partition setting on resource (#5618)
* fix default partition setting on resource
* Handle DEFAULT partition in rule checker.
Co-authored-by: Ken Stevens <khstevens@gmail.com>
* Add setting to make broker not use JacksonMessageConverter (#5611)
* Add setting to make broker not use JacksonMessageConverter
* Add changelog
* Implement suggestions
---------
Co-authored-by: juan.marchionatto <juan.marchionatto@smilecdr.com>
* Fix version
* add changelog, add attribution, remove accidental bring-overs
* add changelog, add attribution, remove accidental bring-overs
* Finish jira section
---------
Co-authored-by: Ole Hedegaard <ohe@trifork.com>
Co-authored-by: Ken Stevens <khstevens@gmail.com>
Co-authored-by: Michael Buckley <michaelabuckley@gmail.com>
Co-authored-by: James Agnew <jamesagnew@gmail.com>
Co-authored-by: longma1 <32119004+longma1@users.noreply.github.com>
Co-authored-by: Long Ma <long@smilecdr.com>
Co-authored-by: jmarchionatto <60409882+jmarchionatto@users.noreply.github.com>
Co-authored-by: juan.marchionatto <juan.marchionatto@smilecdr.com>
* $poll-export-status operation with PatientIdPartitionInterceptor fails with NullPointerException (#5681)
* Fix NullPointerException when performing a system bulk export in the presence of PatientIdPartitionInterceptor.
* Fix NPE on -export-status operation with PatientIdPartitionInterceptor
* 5654 measurescorer bug for denominator exception (#5677)
* update measure bundles and tests for enforced populationId specification on Measure group resources
* bump CR version to PRE17
* fix bug in versionEnumTest
* Update hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/7_0_0/5654-measurescorer-bug.yaml
Co-authored-by: Tadgh <garygrantgraham@gmail.com>
---------
Co-authored-by: Tadgh <garygrantgraham@gmail.com>
* Revert Remote Terminology lookup operation to support all types of CodeSystem property and convert to them to string type. (#5698)
* Revert Remote Terminology lookup operation to support all types of CodeSystem property and convert to them to string type.
* Spotless fix
* Address code review comments
* version bump to 7.0.0
* pipeline fix
* Update java home
* Updating version to: 7.0.1 post release.
* post mergeback cleanup
* bump clinical-reasoning.version to pre17
* test fix
* version bump to 7.1.5-snapshot
---------
Co-authored-by: Long Ma <long@smilecdr.com>
Co-authored-by: Tadgh <garygrantgraham@gmail.com>
Co-authored-by: Etienne Poirier <33007955+epeartree@users.noreply.github.com>
Co-authored-by: peartree <etienne.poirier@smilecdr.com>
Co-authored-by: Nathan Doef <n.doef@protonmail.com>
Co-authored-by: volodymyr-korzh <132366313+volodymyr-korzh@users.noreply.github.com>
Co-authored-by: Luke deGruchy <luke.degruchy@smilecdr.com>
Co-authored-by: Michael Buckley <michaelabuckley@gmail.com>
Co-authored-by: Martha Mitran <martha.mitran@smilecdr.com>
Co-authored-by: JP <jonathan.i.percival@gmail.com>
Co-authored-by: Justin McKelvy <60718638+Capt-Mac@users.noreply.github.com>
Co-authored-by: jmarchionatto <60409882+jmarchionatto@users.noreply.github.com>
Co-authored-by: juan.marchionatto <juan.marchionatto@smilecdr.com>
Co-authored-by: Ole Hedegaard <ohe@trifork.com>
Co-authored-by: Ken Stevens <khstevens@gmail.com>
Co-authored-by: James Agnew <jamesagnew@gmail.com>
Co-authored-by: markiantorno <markiantorno@gmail.com>
* Fix#5110 - Failure in tx processing
* Test fix
* Work on narrowins
* Add changelog
* Docs cleanup
* Fix compile error
* Rollback incompatible change
* Test fix
* Test fix
* Force update
* Test fixes
* Build fixes
* Bump HTMLUnit
* Update hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/7_2_0/5712-apply-searchnarrowing-to-conditional-urls.yaml
Co-authored-by: Ken Stevens <khstevens@gmail.com>
* Address review comments
* Version bump to 7.1.4-SNAPSHOT
* Spotless
* Roll back version
---------
Co-authored-by: Ken Stevens <khstevens@gmail.com>
* Throw exception when resourceType of parameter value is invalid when performing FHIR search with non-chained reference
* Fix changelog issue id and spotless warning
* Cleanup unnecessary test
* Validate resourceType only when using relative reference
* Fix test for search using _type parameter
* Refactor and fix functionality dealing with ReadPartitionIdRequestDetails
* Spotless fixes
* Revert some of the refactoring changes to BaseRequestPartitionHelperSvc and fix tests
* Small cleanup
* Missing change
* Small changes
* Fix tests and add a few more
* Spotless fix
* Address code review comments
* Some polishing on the interface annotations and documentation
* Spotless fix
* Fix test
* Fix tests and test method rename
* Ensure SearchParameterMap is not null
---------
Co-authored-by: Martha Mitran <martha.mitran@smilecdr.com>
* Solution to caching issue with new tests.
* Fix animal sniffer issue. Clean up unit tests. Finalize changelog. Add TODO referencing change in validation cache behaviour.
* Spotless.
* Fix unit test.
* Code review feedback.
* Suspend tx when refreshing version cache
* Undo refactor to reduce merge size
* changelog
* Bump to 7.1.3
* Fix version test
* Unwrap transaction proxy
* Throw exception when resourceType of parameter value is invalid when performing FHIR search with non-chained reference
* Fix changelog issue id and spotless warning
* Cleanup unnecessary test
* Validate resourceType only when using relative reference
* Fix test for search using _type parameter
* pom bump to 7.0.0 (#5615)
* pom bump to 7.0.0
* add version enum
* fixed feb release name
---------
Co-authored-by: Long Ma <long@smilecdr.com>
* Check index existence on raw SQL creation (#5624)
* Add conditional check on index existence before we try again
* Add conditional check on index existence before we try again
* Changelog
* remit
* remit
* debug statements
* 5621 deadlock on caffeine cache when creating a resource with conditional create (#5622)
* Modifying the CacheProvider to avoid doing db I/O within the cache miss value supplier callback.
* Setting the initial capacity of instantiated caches to the cache max size to avoid resizing during operations.
* adding changelog and spotless.
* Fixing typo.
* Addressing comments from code review.
---------
Co-authored-by: peartree <etienne.poirier@smilecdr.com>
* Searching with more than one chained Bundle SearchParameter returns incorrect results (#5614)
* Failing test
* fix
* changelog
* Avoiding Exception being thrown on @EventListener invocation (#5628)
* replaced EventListener annotation with @PreDestroy
* adding changelog
---------
Co-authored-by: peartree <etienne.poirier@smilecdr.com>
* simple fix (#5630)
Co-authored-by: Long Ma <long@smilecdr.com>
* Incorrect version of auto versioned reference for conditional update with urn id placeholder (#5625)
* Incorrect version from versioned_references.auto_at_paths for conditional update - implementation
* Oracle: Ensure migrated database still takes large resource text updates (#5629)
* First pass at fix to Oracle HFJ_RES_VER.RES_TEXT_VC migration.
* First stab at agreed upon solution.
* Fix error with 4001 by removing unnecessary annotation.
* Spotless and TODO.
* Remove annotation for good and set length to LONG32.
* Fix copyright year.
* Finalize changelog.
* Remove migration changes. Fix unit test.
* Fix compile error.
* Log output.
* Refactor resource history code into new ResourceHistoryCalculator.
* Spotless.
* Convert record to POJO.
* Restore pre-17 switch statement.
* Finalize new resource history calculator code and tests.
* Spotless.
* Remove logging.
* Update hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/7_0_0/5633-oracle-hfj-res-ver-clob-migration.yaml
Apply code reviewer suggestion
Co-authored-by: Michael Buckley <michaelabuckley@gmail.com>
* Code review feedback.
---------
Co-authored-by: Michael Buckley <michaelabuckley@gmail.com>
* Fix expansion for `ValueSet` with no concepts based on CodeSystem `urn:ietf:bcp:13` (#5638)
* When fetching the mimetype code system, return empty CodeSystem with NOTSUPPORTED content. Update expansion logic to handle this case. Add some test cases.
* Minor change to fix test
* Rename changelog file
* Remove TODOs as they're replaced by reported issue
* Revert accidental change added with TODO removal
* $expunge operation ignoring ExpungeThreadCount setting in certain cases (#5637)
* $expunge operation ignoring ExpungeThreadCount setting in certain cases - implementation
* Fix Measure group id null pointer exception (#5620)
* Update to new version of clinical reasoning, includes a fix for null pointers on Measure group id
* add changelog
---------
Co-authored-by: Justin McKelvy <60718638+Capt-Mac@users.noreply.github.com>
* Rule evaluation: Allow Bundles with PATCH Parameters (#5641)
* Remove parameters clause.
* Finalize changelog. Add tests. Finalize implementation.
* Undo changes to this test.
* Revert all changes to FhirQueryRuleImplTest. Add new RuleImplOpTest. Ensure that proper nested Bundle is created for test and other fixes.
* Tweak test.
* Use real rule applier in test and remove all mocks.
* Prevent batch2 job execution to stop for empty chunk when last job st… (#5635)
* Prevent batch2 job execution to stop for empty chunk when last job step is a reduction.
Add output to bulk export result even when empty.
* Fix test
* Unimportant change to force fresh build
* Implement review suggestions
---------
Co-authored-by: juan.marchionatto <juan.marchionatto@smilecdr.com>
* Index review fixes (#5649)
* Don't hold locks while adding indices during upgrade.
* concurrent indexing is non-transactional in PG.
* Fix conditional creates without leading '?' (#5646)
* First commit with failing test.
* More tests and logs.
* More logs
* Try new solution for BaseTransactionProcessor.performIdSubstitutionsInMatchUrl().
* Simplify solution. Add more tests.
* Changelog.
* javadoc
* Searching for Bundles with read all Bundles permission returns 403 (#5644)
* failing test
* another failing test case
* fix
* changelog
* fix bug
* spotless
* cr
* Fix NullPointerException when performing a system bulk export in the presence of PatientIdPartitionInterceptor. (#5660)
* Serializing changes for sensitive data (#5655)
* Add new senstiive data serializer
* Add new senstiive data serializer
* Add new senstiive data serializer
* Remove dead comments
* Change up the test
* review comments
* wip
* Tighten tests and push annotation down
* Tighten tests and push annotation down
* Changelog
* Add test
* 7.0.1-SNAPSHOT bump
* Error code
* Add method used by CDR
* add version enum
* Fix test
* Rel 7 0 CVE (#5663)
* Bump json-path
* Pin parrson
* Bump elastic
* Bump spring version
* Exclude JDBC
* Descendent fix (#5669)
* Fix "is-a" ValueSet expansion, add "descendent-of" support
* Fixed tests in DSTU3 and R5
* Trigger new build
* Revert "Trigger new build"
This reverts commit 46c672b338.
* fix default partition setting on resource (#5617)
* fix default partition setting on resource
* changelog
* Handle DEFAULT partition in rule checker.
* Fix spotless
---------
Co-authored-by: Michael Buckley <michaelabuckley@gmail.com>
Co-authored-by: James Agnew <jamesagnew@gmail.com>
* pom bump, doc add, version enum add (#5616)
Co-authored-by: Long Ma <long@smilecdr.com>
* fix default partition setting on resource (#5618)
* fix default partition setting on resource
* Handle DEFAULT partition in rule checker.
Co-authored-by: Ken Stevens <khstevens@gmail.com>
* Add setting to make broker not use JacksonMessageConverter (#5611)
* Add setting to make broker not use JacksonMessageConverter
* Add changelog
* Implement suggestions
---------
Co-authored-by: juan.marchionatto <juan.marchionatto@smilecdr.com>
* Fix version
* add changelog, add attribution, remove accidental bring-overs
* add changelog, add attribution, remove accidental bring-overs
* Finish jira section
---------
Co-authored-by: Ole Hedegaard <ohe@trifork.com>
Co-authored-by: Ken Stevens <khstevens@gmail.com>
Co-authored-by: Michael Buckley <michaelabuckley@gmail.com>
Co-authored-by: James Agnew <jamesagnew@gmail.com>
Co-authored-by: longma1 <32119004+longma1@users.noreply.github.com>
Co-authored-by: Long Ma <long@smilecdr.com>
Co-authored-by: jmarchionatto <60409882+jmarchionatto@users.noreply.github.com>
Co-authored-by: juan.marchionatto <juan.marchionatto@smilecdr.com>
* fix conflict mistake
* removed test assert that is no longer true:
* version bumpb to 7.1.1
* fix version Enum test
---------
Co-authored-by: Long Ma <long@smilecdr.com>
Co-authored-by: Tadgh <garygrantgraham@gmail.com>
Co-authored-by: Etienne Poirier <33007955+epeartree@users.noreply.github.com>
Co-authored-by: peartree <etienne.poirier@smilecdr.com>
Co-authored-by: Nathan Doef <n.doef@protonmail.com>
Co-authored-by: volodymyr-korzh <132366313+volodymyr-korzh@users.noreply.github.com>
Co-authored-by: Luke deGruchy <luke.degruchy@smilecdr.com>
Co-authored-by: Michael Buckley <michaelabuckley@gmail.com>
Co-authored-by: Martha Mitran <martha.mitran@smilecdr.com>
Co-authored-by: JP <jonathan.i.percival@gmail.com>
Co-authored-by: Justin McKelvy <60718638+Capt-Mac@users.noreply.github.com>
Co-authored-by: jmarchionatto <60409882+jmarchionatto@users.noreply.github.com>
Co-authored-by: juan.marchionatto <juan.marchionatto@smilecdr.com>
Co-authored-by: Ole Hedegaard <ohe@trifork.com>
Co-authored-by: Ken Stevens <khstevens@gmail.com>
Co-authored-by: James Agnew <jamesagnew@gmail.com>